【问题标题】:How to create an oracle.sql.ARRAY object?如何创建 oracle.sql.ARRAY 对象?
【发布时间】:2011-12-14 06:59:16
【问题描述】:

这个问题与我原来的问题How to return an array from Java to PL/SQL ?有关,但更具体。

我一直在阅读Oracle Database JDBC Developer's Guide

但我仍然无法编写可以使用

创建 ARRAY 的最少代码
ARRAY 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 程序员。

【问题讨论】:

  • 首先,您必须“将类型元素创建为 varray(22) OF NUMBER(5,2);”然后在 oracle.jdbc.OracleConnection.createARRAY() 中使用这个类型
  • @Zaki:如果您仔细阅读这个问题,我相信您会看到我正在做的事情。类型名称是widgets_t

标签: java oracle jdbc oracle11gr2


【解决方案1】:

您在#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);

【讨论】:

  • 嗯 ...在你的例子中,我不幸遇到了编译错误:cannot find symbol: method unwrap(java.lang.Class<oracle.jdbc.OracleConnection>)
  • 但如果我将Connection 转换为OracleConnection,我的示例将编译:oracle.jdbc.OracleConnection oraConn = (oracle.jdbc.OracleConnection)ora.defaultConnection(); +1 为此。
  • unwrap 是 Java 6。如果您使用的是较旧的 Java,则需要强制转换。
  • 对于多年后查看此内容的任何人,createARRAY 现在已弃用,您应该使用createOracleArray apparently
【解决方案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"

【讨论】:

    【解决方案3】:
    // 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();
    

    【讨论】:

    • 我可以根据这个答案编写一个编译示例。然而,这种方式在 Oracle 11g 中不再记录,但似乎是 10g 和更早版本的方式。
    【解决方案4】:

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

    【讨论】:

    • 听起来优雅而直接,但不幸的是我所有的努力都结束了:cannot find symbol: createArrayOf(java.lang.String,java.lang.String[]) location: interface java.sql.Connection。还是谢谢!
    • 啊!来自Oracle documentation服务器端嵌入式 JVM 使用 Java Development Kit (JDK) 1.5
    • 啊!来自Oracle documentationOracle JDBC 不支持 java.sql.Connection 接口的 JDBC 4.0 方法 createArrayOf 方法。此方法只允许匿名数组类型,而所有 Oracle 数组类型都被命名。请改用 Oracle 特定方法 oracle.jdbc.OracleConnection.createARRAY。
    【解决方案5】:

    Map 参数 = new HashMap();

        params.put("input_to_sp", new ExampleArrayMapper (new String[] { "ABC" }));
    
        Map<String, Object> results = spObject.execute(params);
    
        final List<Object> output = (List<Object>) results.get("po_out_cur");
    

    公共类 ExampleArrayMapper 扩展 AbstractSqlTypeValue { 私有字符串[] 自定义对象;

        public ExampleArrayMapper (String[] customObject) {
            this.customObject= customObject;
        }
    
        public String getSQlTypeName() throws SQLException {
            return "NAME_OF_TYPE_IN_SQL";
        }
    
        @Override
        protected Object createTypeValue(Connection con, int sqlType, String typeName) throws SQLException {
            try {
                con = dataSource.getConnection().unwrap(OracleConnection.class);
                Array reportsArray = ((OracleConnection) con).createOracleArray(SQL_TYPE_NAME, customObject);
                return reportsArray;
            } finally {
                con.close();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2018-07-21
      • 2011-03-17
      • 2019-03-24
      • 2013-06-23
      • 2018-03-13
      相关资源
      最近更新 更多