1回の呼び出しで複数の結果セットをOracleからJDBCに戻すことができます。それを行うにはいくつかの方法があります。 a good post at Oracle-Base shows how。
私が使用するメカニズムは、呼び出し可能なステートメントで匿名ブロックを作成し、各結果セットに出力パラメータとしてSYS_REFCURSOR
をバインドすることです。
これだけのコードがあります。エラー処理のために怠惰ですが、それはアイデアを得る:
public void getMultiple() throws Exception {
// get connection
Connection conn = DriverManager.getConnection(TestConfig.JDBC_URL, TestConfig.DB_USERNAME, TestConfig.DB_PASSWORD);
// here's the statement; it uses an anonymous block. In that block,
// we've declared two SYS_REFCURSOR objects which are opened over our
// SELECT statements. Once the statements are opened, we bind the
// SYS_REFCURSOR objects so they can be retrieved from JDBC
String s =
"DECLARE" +
" l_rs1 SYS_REFCURSOR; " +
" l_rs2 SYS_REFCURSOR; " +
"BEGIN "+
" OPEN l_rs1 FOR " +
" SELECT 'Moose' FROM DUAL;" +
" OPEN l_rs2 FOR " +
" SELECT 'Squirrel' FROM DUAL; " +
" ? := l_rs1;" +
" ? := l_rs2;" +
"END;";
// prepare the callable statement, registering
// the output parameter we want
CallableStatement cs = conn.prepareCall(s);
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.registerOutParameter(2, OracleTypes.CURSOR);
// execute the callable statement
cs.execute();
// retrieve the result sets by getting the bound output objects and
// casting them to Java ResultSet objects
ResultSet rs1 = (ResultSet) cs.getObject(1);
ResultSet rs2 = (ResultSet) cs.getObject(2);
// advance the first result set and print the string it yields
rs1.next();
System.out.printf("Result set 1 has '%s'\n", rs1.getString(1));
// advance the second result set and print the string it yields
rs2.next();
System.out.printf("Result set 2 has '%s'\n", rs2.getString(1));
// close everything up
rs2.close();
rs1.close();
cs.close();
conn.close();
}
私はあなたを助けることを願っています!
ありがとうございました。しかし、私は2つの別のdbコールを行う必要はありませんような方法はありますか? – Daud
2つの選択が同じタイプを返す場合は、共用体を使用できます。しかしそれは本当に悪い練習です –
@Daud:いいえ、2回の呼び出しが必要です。 –