2

RECORD 型が JDBC と互換性がないというのは本当ですか? 使用しているドライバーは OJDBC6.jar です

Java コード:

dbStrategy.openConnection();
        WrappedConnectionJDK6 wrapped = (WrappedConnectionJDK6) dbStrategy.getConnection();
        OracleConnection oracleConnection = (OracleConnection) wrapped.getUnderlyingConnection();
        CallableStatement callableStatement = oracleConnection.prepareCall("{call XXX_Info_Utl_Pkg.get_order_admin(?,?,?,?,?)}");
        callableStatement.setInt(1, Integer.parseInt(orderNumber));
        callableStatement.registerOutParameter(2, OracleTypes.ARRAY, "XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC");
        callableStatement.registerOutParameter(3, OracleTypes.NUMBER);
        callableStatement.registerOutParameter(4, OracleTypes.VARCHAR);
        callableStatement.registerOutParameter(5, OracleTypes.NUMBER);

そしてOracleコード:

PROCEDURE get_order_admin(
            p_order_num_in IN NUMBER,
            p_order_admin_out OUT XXX_info_utl_pkg.seagrs_order_rec,
            p_error_code_out OUT PLS_INTEGER,
            p_error_msg_out OUT VARCHAR2,
            p_ret_status_out OUT PLS_INTEGER);


TYPE seagrs_order_rec
IS
    record
    (
        order_admin        VARCHAR2(10),
        contact_name       VARCHAR2(50),
        contact_email_addr VARCHAR2(100),
        contact_phone_num  VARCHAR2(30));

ここで直面しているエラーは -

例外: 無効な名前パターン: XXX_INFO_UTL_PKG.SEAGRS_ORDER_REC

4

2 に答える 2

4

JDBC を直接使用して PL/SQL の RECORD 型をフェッチすることはできませんが、無名の PL/SQL ブロックを記述してレコードをローカル変数に返すことはできます。このローカル変数は、次のように個々の属性に分解できます。

DECLARE
    rec XXX_info_utl_pkg.seagrs_order_rec;
BEGIN
    get_order_admin(?, rec, ?, ?, ?);
    ? := rec.order_admin;
    ? := rec.contact_name;
    ? := rec.contact_email_addr;
    ? := rec.contact_phone_num;
END;

次の JDBC コードを使用して、プロシージャを呼び出すことができるようになりました。

try (CallableStatement s = con.prepareCall(" ... previous PL/SQL block ...")) {
    s.setInt(1, Integer.parseInt(orderNumber));

    // Ordinary out parameters
    s.registerOutParameter(2, Types.NUMBER);
    s.registerOutParameter(3, Types.VARCHAR);
    s.registerOutParameter(4, Types.NUMBER);

    // Out parameters from your decomposed record
    s.registerOutParameter(5, Types.VARCHAR);
    s.registerOutParameter(6, Types.VARCHAR);
    s.registerOutParameter(7, Types.VARCHAR);
    s.registerOutParameter(8, Types.VARCHAR);

    s.execute();
    // Now, retrieve all the out parameters
}

最近、この手法について詳しくブログに書いています。ブログ投稿には、IN/OUT パラメーターを記録するすべての関数/プロシージャーの匿名 PL/SQL ブロックを自動的に生成する方法についての説明も含まれています。

于 2016-11-13T21:40:50.430 に答える