0

我使用以下代码创建 varchar2 的 Oracle ARRAY:

CREATE TYPE T_VARCHAR_LIST AS TABLE OF varchar2(32);

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(
      "jdbc:oracle:thin:@localhost:1521:TEST", user, password);
ArrayDescriptor arrayDescriptor = ArrayDescriptor.
      createDescriptor("T_VARCHAR_LIST", connection);
ARRAY array = new ARRAY(arrayDescriptor, conection, new String[]{"1", "2", "3"});

但是array.getArray()返回["???", "???", "???"]

任何想法为什么 varchar2 的 ARRAY 没有正确创建?

顺便说一句,数字数组 ( CREATE TYPE T_NUM_LIST AS TABLE OF NUMBER) 已成功创建。

4

1 回答 1

1

我拿走了你的代码,并通过一些小的改动让它运行:

我的 Array TYPE 对象是这样的:

create or replace
TYPE TBL_ARRAY_VARCHAR2  AS TABLE OF VARCHAR2(80);

我的代码如下所示:

try {
        Connection con;
        Class.forName("oracle.jdbc.driver.OracleDriver");

        con = DriverManager.getConnection(
                "jdbc:oracle:thin:@myhost:1521:LX1120", user,
                password);
        ArrayDescriptor arrayDescriptor = ArrayDescriptor.createDescriptor(
                "TBL_ARRAY_VARCHAR2", con);
        ARRAY array = new ARRAY(arrayDescriptor, con, new String[] { "1",
                "2", "3" });

        Object oArray = array.getArray();
        System.out.println(oArray.getClass().getName());

        if (oArray instanceof String[]) {
            String[] oArrayString = (String[]) oArray;
            for (int i = 0; i < oArrayString.length; i++) {
                System.out.println(i + ":" + oArrayString[i]);
            }
        }

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

我运行它时看到的是:

[Ljava.lang.String;
0:1
1:2
2:3

因此,您尝试做的事情没有错...

我的猜测——基于使用许多不同版本的 Oracle 和不同的 Oracle JDBC 驱动程序——是你的 JDBC 驱动程序版本和数据库版本不匹配,但这只是一个猜测。如果我是你,我会从服务器复制 JDBC 驱动程序并重试。请注意,即使名称不变,驱动程序的内容也可能发生变化,因此您需要做的不仅仅是比较名称。

大卫·罗尔夫

于 2013-02-25T22:02:58.603 回答