8

Javapl/sqlで、配列を返す関数から値を取得する方法。

私のpl/sql関数が という配列を返す場合、Javaでは、を使用してJavaオブジェクトにmyArray値をフェッチすることは可能ですか?myArraycallablestatement

ありがとう

更新 1

関数を呼び出している Java コードですが、例外が発生しています。

PLS-00306: wrong number or types of arguments in call to 'myfunc'




connection = con.getConnection();
        callablestatement = connection.prepareCall("{call myfunc(?,?,?}");
        callablestatement.setInt(1, param1);
        callablestatement.setInt(2, param2);
        callablestatement.setString(3, param3);
        callablestatement.registerOutParameter(4, Types.ARRAY);
        callablestatement.execute();        
        resultSet = callablestatement.getArray(4).getResultSet();

更新 2

private final String PRODECURE_NAME = "{? = call myfunc(?,?,?)}";

connection = con.getConnection();
    callablestatement = connection.prepareCall(PRODECURE_NAME);
    callablestatement.registerOutParameter(1, Types.ARRAY);
    callablestatement.setInt(2, param1);
    callablestatement.setInt(3, param2);
    callablestatement.setString(4, param3);

    callablestatement.execute();

create or replace type dates
       is varray(100) of varchar2(32);

関数

CREATE OR REPLACE function myfunc (    
    p_id    IN number,
    p_c_id     IN number,
    p_co_no     IN number

)
    RETURN dates
AS
    myarray contract_dates;
    par1        VARCHAR2 (32);
    par2        VARCHAR2 (32);

修正済みアップデート 3

connection = con.getConnection();
        callablestatement = 
                connection.prepareCall("begin ? :=myfunc(?,?,?); end;");
        callablestatement.registerOutParameter(1, OracleTypes.ARRAY, "DATES");
        callablestatement.setInt(2, param1);
        callablestatement.setInt(3, param2);
        callablestatement.setString(4, param3);
        callablestatement.execute();
4

5 に答える 5

4

私はそれをしませんでしたが、うまくARRAYいくはずです。outまず、関数のパラメーターを登録する必要があります。だからこういうこともある。

private final String PRODECURE_NAME = "{? = call <ProcedureName>(?,?,?)}";

Connection con = null;
CallableStatement cs = null;

       try {
            con = DAOFactory.getDatabaseConnection();
            cs = con.prepareCall(PRODECURE_NAME);
            cs.registerOutParameter(1, java.sql.Types.ARRAY);
            cs.setYourType(2, <yourData>);
            cs.setYourType(3, <yourData>);
            cs.setYourType(4, <yourData>);
            cs.execute();
            Array arr = cs.getArray(1);
            if (arr != null) {
               String[] data = (String[]) arr.getArray();
            }
        } 
        catch (SQLException ex) {
            Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
            try {
                con.rollback();
            }
        }
        finally {
            if (con != null) {
                try {
                    con.close();
                } 
                catch (SQLException ex) {
                    Logger.getLogger(OracleLiekDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

この男を試してみて、それができるかどうか答えてください。

編集:

これらの文字設定する1つのパラメーターを表します(パラメーター化された名前です)。したがって、この:

cs.setYourType(2, <yourData>);
cs.setYourType(3, <yourData>);
cs.setYourType(4, <yourData>);

つまり、3 つのパラメーター (?) を設定します。メソッドの最初のパラメーターは列インデックスで、2 番目は特定の型のデータです。


編集2:

申し訳ありませんが、私は悪い解決策を書きましたが、すでに更新されているので、今すぐコードを確認して試してください。

于 2012-05-28T13:58:55.347 に答える
1

PL/SQL から返された myArray の型はjava.sql.Arrayです。その上でgetArray()を呼び出し、型キャストしてJava arrayを取得できます。

String[] array = (String[]) myArray.getArray();
于 2012-05-28T13:37:35.353 に答える
1

registerOutParameterはい、タイプする必要がありますこちらTypes.ARRAY
の 例を参照してください

于 2012-05-28T13:41:26.123 に答える
1

JDBC 仕様には、配列の処理専用のセクション全体 (16.5) が含まれています。あなたはそれを見てみたいかもしれません。

于 2012-05-28T13:41:40.027 に答える
1

java.sql.Array の直接の子孫である SerialArray クラスにある次のメソッドを使用できると思います。

Object getArray(Map<String, Class<?>> map)

ここで、Map は、返された配列でフェッチされた結果セットにマップされるオブジェクトとそのプロパティのホルダーです。

詳細については、http: //docs.oracle.com/javase/1.5.0/docs/api/javax/sql/rowset/serial/SerialArray.html javadocを参照してください。

于 2012-05-28T13:42:59.220 に答える