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

私はあなたのコードを取得し、いくつかの小さな変更を加えて実行しました。

私の配列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 に答える