获取多结果集¶
如果存储过程返回值为refcursor类型,则CallableStatement对象调用getObject(parameterIndex)获取ResultSet结果集。返回值中有多列refcursor类型时,用同样的方式逐个获取。
备注:要使用callablestatemt获取多结果集,必须将connecton设置成手动提交;CallableStatement对象返回的多结果集是只向前读且不可更新的.所以不能调用absolute(),updateRow(),last()等方法。
示例如下:
String sql;
stmt = con.createStatement();
// 插入数据
sql = "INSERT INTO TEMP VALUES(2,'shentong')";
stmt.executeUpdate(sql);
// 创建存储过程
sql = "CREATE OR REPLACE PROCEDURE TEST_PRO5"
+ "(out_param1 OUT REFCURSOR,out_param2 OUT REFCURSOR) "
+ " AS BEGIN "
+ " OPEN out_param1 FOR SELECT * FROM TEMP;"
+ " OPEN out_param2 FOR SELECT * FROM TEMP;"
+ " END TEST_PRO5; ";
stmt.execute(sql);
// 调用存储过程
con.setAutoCommit(false);
cstmt = con.prepareCall("{call TEST_PRO5(?,?)}");
cstmt.setFetchSize(2);
cstmt.registerOutParameter(1, OscarTypes.CURSOR);
cstmt.registerOutParameter(2, OscarTypes.CURSOR);
cstmt.execute();
ResultSet rs = (ResultSet)cstmt.getObject(1);
assertNotNull(rs.getCursorName());
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
}
rs = (ResultSet)cstmt.getObject(2);
assertNotNull(rs.getCursorName());
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
}
con.commit();
stmt.close();
con.commit();
con.setAutoCommit(true);