Możliwe jest odzyskanie wielu zestawów wyników z Oracle do JDBC w jednym wywołaniu. Można to zrobić na kilka sposobów; a good post at Oracle-Base shows how.
Mechanizm, którego używam, polega na utworzeniu anonimowego bloku w instrukcji wywoływalnej, a następnie powiązaniu SYS_REFCURSOR
dla każdego zestawu wyników jako parametru wyjściowego.
Oto kod, który właśnie to robi. Jest leniwy, jeśli chodzi o obsługę błędów, ale wpada na pomysł:
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();
}
Mam nadzieję, że wam pomogę!
Dzięki. Ale czy jest jakiś sposób, żebym nie musiał wykonywać dwóch oddzielnych wywołań db? – Daud
Jeśli dwa zaznaczenia zwracają te same typy, można użyć zrostu. Ale jest to prawdziwa Zła praktyka –
@Daud: nie, potrzebujesz dwóch połączeń. –