How to create an oracle.sql.ARRAY object?

笑着哭i 提交于 2019-11-28 12:21:09

You're on the right track with #2, but you can't create an oracle Array from a connection of type java.sql.Connection. It has to be an OracleConnection to be able to use those methods.

oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
java.sql.Connection conn = ora.defaultConnection();
OracleConnection oraConn = conn.unwrap(OracleConnection.class);
oracle.sql.ARRAY widgets = oraConn.createARRAY("widgets_t", elements);
user272735

Based on answers of Affe and Chris Mazzola I have succeeded to build two examples that compile in Oracle 11g R2 database.

Example based on Affe's answer

create or replace type widgets_t is table of varchar2(32767);
/

create or replace and compile java source named "so20ja1" as
public class so20ja1 {
    public void f1() throws java.sql.SQLException {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
        java.sql.Connection conn = ora.defaultConnection();
        oracle.jdbc.OracleConnection oraConn = (oracle.jdbc.OracleConnection)conn;
        java.sql.Array widgets = oraConn.createARRAY("widgets_t", elements);
    }
};
/
show errors java source "so20ja1"

Example based on Chris Mazzola's answer

create or replace type widgets_t is table of varchar2(32767);
/

create or replace and compile java source named "so20ja2" as
public class so20ja2 {
    public void f1() throws java.sql.SQLException {
        String[] elements = new String[]{"foo", "bar", "zoo"};
        oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver();
        java.sql.Connection conn = ora.defaultConnection();
        oracle.sql.ArrayDescriptor desc = 
            oracle.sql.ArrayDescriptor.createDescriptor("widgets_t", conn);
        java.sql.Array widgets = new oracle.sql.ARRAY(desc, conn, elements);
    }
};
/
show errors java source "so20ja2"
// array sample (using a stored procedure to sum two or more numbers)
Connection connection = dataSource.getConnection(username,password);
ArrayDescriptor desc = 
    ArrayDescriptor.createDescriptor(schemaName + "." + arrayType, connection);

// first ? is the array, second ? is the result via out parameter
String sql = "call sum_numbers(?,?)";
CallableStatement cs = connection.prepareCall(sql);

String[] args = {"5","15","25","35"}; // what to sum
Array array = new oracle.sql.ARRAY(desc, connection, args);

cs.setArray(1, array);
cs.registerOutParameter(2, Types.INTEGER);
cs.execute();
int result = cs.getInt(2);
cs.close();

Just to mention that in Java 1.6 you have connection.createArrayOf(..), which is standard.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!