获取多结果集

如果存储过程返回值为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);