私は次のような 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));
質問:
- 方法2は「SQLException: すべての戻りパラメータが登録されていません」、しかし、SQL文を「開始..終了;" - その場合、方法 2 は問題なく機能します。
- 方法1が「始まり..終わり「ただし、方法 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