此问题与我的原始问题How to return an array from Java to PL/SQL ?有关,但更为具体。
我一直在阅读Oracle Database JDBC Developer's Guide和
但我仍然无法编写最小代码,我可以使用
创建ARRAYARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements);
按照Creating ARRAY objects的说明。
我正在使用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程序员。
答案 0 :(得分:7)
您使用#2处于正确的轨道上,但无法从类型为java.sql.Connection的连接创建oracle阵列。它必须是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);
答案 1 :(得分:2)
基于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"
答案 2 :(得分:1)
// 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();
答案 3 :(得分:-1)
请注意,在Java 1.6中,您有connection.createArrayOf(..)
,这是标准的。