如何创建oracle.sql.ARRAY对象?

这个问题与我的原始问题有关如何将数组从Java返回到PL / SQL? ,但更具体。

我一直在阅读Oracle数据库JDBC开发人员指南和

  • 创建ARRAY对象
  • 服务器端内部驱动程序
  • oracle.jdbc.OracleConnection
  • oracle.jdbc.OracleDriver

但我仍然无法编写最小代码,我可以使用它来创建ARRAY

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements); 

按照创建ARRAY对象中的说明进行操作。

我正在使用Oracle数据库JVM。

我试过以下:

例1

 create or replace type widgets_t is table of varchar2(32767); / create or replace and compile java source named "so20j1" as public class so20j1 { public void f1() { String[] elements = new String[]{"foo", "bar", "zoo"}; oracle.sql.ARRAY widgets = oracle.jdbc.OracleConnection.createARRAY("widgets_t", elements); } }; / show errors java source "so20j1" 

失败:

 Errors for JAVA SOURCE "so20j1": LINE/COL ERROR -------- ----------------------------------------------------------------- 0/0 so20j1:4: non-static method createARRAY(java.lang.String,java.lang.Object) cannot be referenced from a static context 0/0 1 error 0/0 ^ 0/0 oracle.sql.ARRAY widgets = oracle.jdbc.OracleConnection.createARRAY("widgets_t", elements); 

例2

 create or replace type widgets_t is table of varchar2(32767); / create or replace and compile java source named "so20j2" as public class so20j2 { public void f1() { String[] elements = new String[]{"foo", "bar", "zoo"}; oracle.jdbc.OracleDriver ora = new oracle.jdbc.OracleDriver(); java.sql.Connection conn = ora.defaultConnection(); oracle.sql.ARRAY widgets = conn.createARRAY("widgets_t", elements); } }; / show errors java source "so20j2" 

失败:

 Errors for JAVA SOURCE "so20j2": LINE/COL ERROR -------- ----------------------------------------------------------------- 0/0 so20j2:6: cannot find symbol 0/0 symbol : method createARRAY(java.lang.String,java.lang.String[]) 0/0 1 error 0/0 oracle.sql.ARRAY widgets = conn.createARRAY("widgets_t", elements); 0/0 ^ 0/0 location: interface java.sql.Connection 

免责声明:我还不是Java程序员。

您使用#2处于正确的轨道上,但无法从类型为java.sql.Connection的连接创建oraclearrays。 必须是OracleConnection才能使用这些方法。

 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); 

基于Affe和Chris Mazzola的答案,我成功构建了两个在Oracle 11g R2数据库中编译的示例。

基于Affe答案的示例

 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" 

示例基于Chris Mazzola的回答

 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(); 

只是要提一下,在Java 1.6中你有connection.createArrayOf(..) ,这是标准的。