1

我正在调用一个带有少量输出参数的 sp,并且根据我的要求,我需要在某些条件下使用 ResultSet 并在其他条件下使用输出参数。但是使用 executeQuery(),我得到了,JZ0R0: ResultSet has already been closed 错误。(我使用的是 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 对象,反之亦然?

4

2 回答 2

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。

于 2011-04-07T05:31:07.417 回答
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 时也遇到过同样的问题,就在几天前;)

于 2013-04-18T14:02:12.763 回答