Oracle の RETURNING INTO の使用 (JDBC、Prepared Statement) 質問する

Oracle の RETURNING INTO の使用 (JDBC、Prepared Statement) 質問する

私は次のような Oracle ステートメントを実行するために JDBC を使用しています。

"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert

Java で上記のステートメントを呼び出す方法はいくつか見つかりました。主に次のとおりです。

  • OraclePreparedStatement の使用:

    ps = (OraclePreparedStatement)conn.prepareStatement(sql);
    ps.setString(1, "myvalue");
    ps.registerReturnParameter(2, Types.VARCHAR);
    ps.execute();
    rs = ps.getReturnResultSet();
    rs.next();
    System.out.print(rs.getString(1));
    
  • CallableStatement の使用:

    cs = conn.prepareCall(sql);
    cs.setString(1, "myvalue");
    cs.registerOutParameter(2, Types.VARCHAR);
    cs.execute();
    System.out.print(cs.getString(1));
    

質問:

  1. 方法2は「SQLException: すべての戻りパラメータが登録されていません」しかし、SQL文を「開始..終了;" - その場合、方法 2 は問題なく機能します。
    • 方法1が「始まり..終わり「ただし、方法 2 では「始まり..終わり「働く?」
    • 「どんな「魔法」」始まり..終わり」をステートメントに追加すると、「すべてのパラメータが登録されていません」という問題が突然解決しますか?

  2. 上記を実行するための、3 つ目のより良い方法はありますか?

AGさん、ありがとう。

ベストアンサー1

返される句で指定されたパラメータは、通常の出力パラメータとは異なる方法で処理されるためです (getReturnResultSet と getResultSet と callablestatement の返されるパラメータ)。
これらは OraclePreparedStatement で処理する必要があります。2 番目のケースでは、挿入文を begin..end で囲むと、挿入はデータベース自体によって処理され、jdbc は匿名の PLSQL ブロックとして認識します。
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

おすすめ記事