【问题标题】:Couldn't create Oracle ARRAY of varchar2 in JDBC无法在 JDBC 中创建 varchar2 的 Oracle ARRAY
【发布时间】:2013-02-25 19:40:19
【问题描述】:

我使用以下代码创建 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) 已成功创建。

【问题讨论】:

  • 检查您是否在类路径中包含orai18n.jar,如果没有尝试添加它(在 oracle home\jlib 文件夹下)。

标签: arrays oracle jdbc nested-table


【解决方案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 驱动程序并重试。请注意,即使名称不变,驱动程序的内容也可能发生变化,因此您只需比较名称即可。

大卫·罗尔夫

【讨论】:

  • 谢谢你,大卫,你的回答。您使用的是什么版本的 Oracle 和 jdbc?我使用 Oracle 11.2.0.2.0 和 jdbc 11.2.0.3。
  • 我们使用从 8.15 到 11.2 的每个版本的 Oracle,因为我们从事 Oracle 代码生成业务(参见:www.orindasoft.com),但关键是您的驱动程序版本应该相同作为数据库版本。如果它领先你可能会侥幸逃脱,如果它落后就会发生坏事......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2017-02-22
  • 2021-08-06
  • 1970-01-01
  • 2016-09-25
  • 2015-12-18
相关资源
最近更新 更多