Skip to content

Instantly share code, notes, and snippets.

@michael-simons
Last active March 18, 2025 14:33
Show Gist options
  • Select an option

  • Save michael-simons/3f75b5ab9f8dc4d07bec03d80260a3c9 to your computer and use it in GitHub Desktop.

Select an option

Save michael-simons/3f75b5ab9f8dc4d07bec03d80260a3c9 to your computer and use it in GitHub Desktop.
CREATE OR REPLACE FUNCTION READ_JDBC(OPTION OBJECT, query STRING)
RETURNS TABLE(data OBJECT)
LANGUAGE JAVA
RUNTIME_VERSION = '17'
IMPORTS = ('@NEO4J_JARS/drivers/neo4j-jdbc-full-bundle-6.2.0.jar')
// EXTERNAL_ACCESS_INTEGRATIONS = (external_database_network_rule_ext_int)
SECRETS = ('cred' = external_database_cred )
HANDLER = 'JdbcDataReader'
AS $$
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;
public class JdbcDataReader {
record OutputRow(Map<String, String> data) {
public Map<String, String> getData() {
return data;
}
}
public static Class<?> getOutputClass() {
return OutputRow.class;
}
public Stream<OutputRow> process(Map<String, String> jdbcConfig, String query) {
String jdbcUrl = jdbcConfig.get("url");
String username;
String password;
if ("true".equals(jdbcConfig.get("use_secrets"))) {
SnowflakeSecrets sfSecrets = SnowflakeSecrets.newInstance();
var secret = sfSecrets.getUsernamePassword("cred");
username = secret.getUsername();
password = secret.getPassword();
} else {
username = jdbcConfig.get("username");
password = jdbcConfig.get("password");
}
try (var connection = DriverManager.getConnection(jdbcUrl, username, password);
var statement = connection.createStatement();
var resultSet = statement.executeQuery(query);
) {
var metaData = resultSet.getMetaData();
var columnNames = new ArrayList<String>();
var columnCount = metaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
columnNames.add(metaData.getColumnName(i));
}
var streamBuilder = Stream.<OutputRow>builder();
while (resultSet.next()) {
Map<String, String> rowMap = new HashMap<>();
for (String columnName : columnNames) {
String columnValue = resultSet.getString(columnName);
rowMap.put(columnName, columnValue);
}
streamBuilder.add(new OutputRow(rowMap));
}
return streamBuilder.build();
} catch (SQLException ex) {
ex.printStackTrace();
return Stream.of(new OutputRow(Map.of("ERROR", ex.toString())));
}
}
}
$$;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment