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

Java 如何创建oracle.sql.ARRAY对象?,java,oracle,jdbc,oracle11gr2,Java,Oracle,Jdbc,Oracle11gr2,这个问题与我原来的问题有关,但更具体 我一直在阅读和阅读 但我仍然无法编写一个使用 ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements); 按照中的指示 我正在使用Oracle数据库JVM 我尝试过以下方法: 示例1 create or replace type widgets_t is table of varchar2(32767); / create or replac

这个问题与我原来的问题有关,但更具体

我一直在阅读和阅读

但我仍然无法编写一个使用

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements);
按照中的指示

我正在使用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);
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
示例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 "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);
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类型的连接创建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);

仅提及Java 1.6,这是标准版。

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

基于Aff回答的示例

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"
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"
基于Chris Mazzola回答的示例

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"
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"

首先,您必须“将类型元素创建为数字为(5,2);”的varray(22)”,然后在oracle.jdbc.OracleConnection.createARRAY()中使用此类型@Zaki:如果您仔细阅读这个问题,我相信您会明白这正是我正在做的。类型名称是
widgets\u t
.Hmm。。。不幸的是,在您的示例中,我遇到了一个编译错误:
找不到symbol:method unwrap(java.lang.Class)
但是如果我将
连接
转换为
OracleConnection
,我的示例将编译为:
oracle.jdbc.OracleConnection oraConn=(oracle.jdbc.OracleConnection)oral.defaultConnection()+1。展开是Java 6。如果您使用的是较旧的java,则需要强制转换。对于多年后检查此问题的任何人来说,
createARRAY
现在已被弃用,您应该使用
createOracleArray
听起来优雅而直接,但不幸的是,我所有的努力都以:
找不到符号:createArrayOf(java.lang.String,java.lang.String[])位置:接口java.sql.Connection
。无论如何谢谢你!啊!!From:服务器端嵌入式JVM使用Java开发工具包(JDK)1.5.Ah!From:Oracle JDBC不支持java.sql.Connection接口的JDBC 4.0方法createArrayOf方法。此方法仅允许匿名数组类型,而所有Oracle数组类型都已命名。改为使用Oracle特定的方法Oracle.jdbc.OracleConnection.createARRAY。然而,Oracle 11g中不再记录这种方式,但似乎是10g和更早版本的方式。