The example below is based on a Java Class which allows you to connect to any RDBMS and run any SQL query with a list of comma separated columns defined as parameters.
1. Create a script which simply runs a Java Class which return data from a query to any RDBMS.
run.sh
java -cp $CLASSPATH /Users/gpadmin/demos/jdbc-externaltable/ojdbc6.jar:/Users/gpadmin/demos/jdbc-externaltable/jdbc_external.jar:. pivotal.au.greenplum.externaltable.InvokeQuery "oracle.jdbc.OracleDriver" "jdbc:oracle:thin:@10.32.243.125:1521/ora11gr2" "scott" "tiger" "|" "empno,ename,deptno" "select empno,ename,deptno from emp"
Usage as follows
Usage:
java -cp $CLASSPATH pivotal.au.greenplum.externaltable.InvokeQuery {driver-class} {url} {username} {passwd} {delimiter} {column-list} {query}
driver-class: JDBC driver class to load at runtime
url: JDBC connection URL
username: database username
passwd: database password
delimiter: What delimiter to use to separate fields
column-list: List of columns to output to console
query: SQL query to run against external RDBMS
2. Create an external table as shown below.
CREATE EXTERNAL WEB TABLE oracle_emps
(empno int, ename character varying(20), deptno int)
EXECUTE '/Users/gpadmin/demos/jdbc-externaltable/run.sh' on host
FORMAT 'TEXT' (DELIMITER '|');
3. Load into Greenplum ensuring to use the fully qualified path to run.sh on the file system.
gpadmin=# \i exttab.sql; DROP EXTERNAL TABLE Time: 13.052 ms CREATE EXTERNAL TABLE Time: 5.190 ms
4. Access as follows
gpadmin=# select * from oracle_emps; empno | ename | deptno -------+--------+-------- 7369 | SMITH | 20 7499 | ALLEN | 30 7521 | WARD | 30 7566 | JONES | 20 7654 | MARTIN | 30 7698 | BLAKE | 30 7782 | CLARK | 10 7788 | SCOTT | 20 7839 | KING | 10 7844 | TURNER | 30 7876 | ADAMS | 20 7900 | JAMES | 30 7902 | FORD | 20 7934 | MILLER | 10 (14 rows) Time: 557.705 ms gpadmin=# select * from oracle_emps where deptno = 20; empno | ename | deptno -------+-------+-------- 7369 | SMITH | 20 7566 | JONES | 20 7788 | SCOTT | 20 7876 | ADAMS | 20 7902 | FORD | 20 (5 rows) Time: 543.120 ms
Finally the java class is defined as follows
package pivotal.au.greenplum.externaltable; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class InvokeQuery { private String url; private String username; private String passwd; private String columnList; private String delimeter; private String driverClassName; private String query; private Connection conn = null; public InvokeQuery() { } private void run (String[] args) throws SQLException { driverClassName = args[0]; url = args[1]; username = args[2]; passwd = args[3]; delimeter = args[4]; columnList = args[5]; query = args[6]; Statement stmt = null; ResultSet rset = null; String[] columns = splitColumns(columnList); try { conn = getConnection(driverClassName); stmt = conn.createStatement(); rset = stmt.executeQuery(query); int size = columns.length; while (rset.next()) { int i = 0; // go through columns and output data for (String column: columns) { i++; if (i < size) { System.out.print(rset.getString(column) + "" + delimeter); } else { System.out.print(rset.getString(column) + "\n"); } } } } catch (Exception e) { e.printStackTrace(); } finally { if (rset != null) { rset.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } } private String[] splitColumns (String columArray) { return columArray.split(","); } private Connection getConnection(String driverClass) throws SQLException, ClassNotFoundException { Class.forName(driverClassName); conn = DriverManager.getConnection(url, username, passwd); return conn; } public static void main(String[] args) throws Exception { InvokeQuery invokeQuery = new InvokeQuery(); if (args.length != 7) { System.out.println("Less then 7 arguments provided, usage as follows"); System.out.println("\nUsage: \n\n\tjava pivotal.au.greenplum.externaltable.InvokeQuery <driver-class> <url> <username> <passwd> <delimeter> <colum-list> <query> \n"); System.exit(-1); } invokeQuery.run(args); } }
No comments:
Post a Comment