No post anterior, temos uma configuração de um Database Link onde a partir de uma BD Oracle consultamos dados em Greenplum, e ao contrário, há solução?
Sim, pelo menos já conheço duas. A primeira é através de um driver JDBC.
Para esta utilização serão utilizados os seguintes recursos:
1) Drive JDBC: O drive JDBC deve ser obtido através do site da Oracle, de acordo com a versão da BD Oracle que será alvo e com a versão do JDK.
2) Classe Java para acesso:
– Criar uma diretoria para colocar a classe e jar (jdbc driver), por exemplo:
mkdir -p /usr/local/gp_to_orcl /usr/local/gp_to_orcl/pivotal/au/greenplum/externaltable
– Copiar o InvokeQuery.java (conteúdo abaixo) para /usr/local/gp_to_orcl/pivotal/au/greenplum/externaltable
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 \n”);
System.exit(-1);
}invokeQuery.run(args);
}
}
– Copiar o ojdbc6.jar (Driver JDBC Oracle) para /usr/local/gp_to_orcl
– Compilar InvokeQuery.java
cd /usr/local/gp_to_orcl/pivotal/au/greenplum/externaltable
javac InvokeQuery.java
– Criar um JAR File
cd /usr/local/gp_to_orcl/
jar cvfe jdbc_external.jar MyMainClass pivotal/au/greenplum/externaltable/InvokeQuery.class
3) Criar um “executável”:
vi /user/local/gp_to_orcl/run.sh
Conteúdo: Atenção aos parametros (servidor, SID, colunas, statement e etc)
export CLASSPATH=/usr/local/gp_to_orcl/ojdbc6.jar:/usr/local/gp_to_orcl/jdbc_external.jar
java pivotal.au.greenplum.externaltable.InvokeQuery “oracle.jdbc.OracleDriver” “jdbc:oracle:thin:@greenplum.m04m.com:1521/orcl” “scott” “oracle” “|” “empno,ename,deptno” “select empno,ename,deptno from emp“
4) Criar uma External Web Table:
CREATE EXTERNAL WEB TABLE oracle_emps
(empno int, ename character varying(20), deptno int)
EXECUTE ‘/usr/local/gp_to_orcl/run.sh‘ on host
FORMAT ‘TEXT’ (DELIMITER ‘|’);
Com estes recursos todos agora já é possível executar o select ao Greenplum a partir do Oracle:
Baseado no post: theblasfrompas.blogspot.pt/2013/09/greenplum-command-based-web-external.html