我正在调用一个没有参数的sp,根据我的要求,我需要在某些条件下使用ResultSet,在其他条件下使用params。但是使用executeQuery(),我得到了,JZ0R0:ResultSet已经被关闭错误。(我使用的是Sybase 15)
以下是示例:
Connection conn = ~~;
CallableStatement cstmt = conn.prepareCall("{call my_sp(?)");
cstmt.registerOutParameter(1,java.sql.Types.INTEGER);
ResultSet rs = cstmt.executeQuery();
如果我尝试做,现在在代码下面,
int res = cstmt.getInt(1);
然后尝试迭代ResultSet对象,如下所示,然后我得到ResultSet关闭错误。
ResultSetMetaData rsmd = rs.getMetaData();
有什么方法可以获取输出参数值然后迭代ResultSet对象,反之亦然?
答案 0 :(得分:2)
根据JDBC规范,您必须在输出参数
之前检索结果集这是原始规格
7.1.7在结果后检索OUT参数
由于某些DBMS施加的限制,建议为了获得最大的可移植性,应在检索OUT参数之前检索由执行CallableStatement对象生成的ResultSet对象中的所有结果。从结果集中检索所有值后,方法ResultSet.next将返回false。
如果CallableStatement对象返回多个ResultSet对象(仅当通过调用方法execute执行它时才可能),则应在检索OUT参数之前检索所有结果。在这种情况下,为了确保已访问所有结果,需要调用Statement方法getResultSet,getUpdateCount和getMoreResults,直到没有更多结果。当所有结果都已用尽时,方法getMoreResults返回false,方法getUpdateCount返回-1。
答案 1 :(得分:0)
我不熟悉syBase,
但可能你可以在MSSQL中输出类似StoredProcedure的脚本:
DECLARE @RC int
DECLARE @pUserID nvarchar(50)
DECLARE @pDepartmentID int
-- TODO: Set parameter values here.
EXECUTE @RC = [AccessMgrDB].[dbo].[SP_GenerateAbsentPresentReport]
@pUserID
,@pDepartmentID
GO
并使用java代码:
set.con.setAutoCommit(false);
Statement st2 = set.con.createStatement();
String queryAbsent = "DECLARE @RC int\n" +
"DECLARE @pUserID nvarchar(50)\n" +
"DECLARE @pDepartmentID int\n" +
"EXECUTE ["+dbSrcNames+"].[dbo].[SP_GenerateAbsentPresentReport] \n" +
""+USER +
","+DPTID+"";
ResultSet rs2 = st2.getGeneratedKeys();
while (rs2.next()){
String userID = rs2.getString("UserID");
Date logDate = rs2.getDate ("logDate");
String logDay = rs2.getString("logDay");
String status = rs2.getString ("status");
int pivot = rs2.getInt ("pivotvalue");
int pivot2 = rs2.getInt ("pivotvalue2");
if(status.equals("Absent"))
absent.add(logDate.toString());
if(status.equals("Present"))
present.add(logDate.toString());
st2.getMoreResults(java.sql.Statement.CLOSE_CURRENT_RESULT);
set.con.commit();
我曾经在调用StoredProcedure之前遇到同样的问题, 它就在几天前;)