返回ResultSet和输出参数的JDBC executeQuery()

返回ResultSet和输出参数的JDBC executeQuery(),jdbc,resultset,executequery,Jdbc,Resultset,Executequery,我正在调用一个sp,但没有几个out参数,根据我的要求,我需要在某些条件下使用ResultSet,在其他条件下使用out参数。但使用executeQuery(),我得到的是,JZ0R0:ResultSet已被关闭错误。(我使用的是Sybase 15) 以下是一个例子: Connection conn = ~~; CallableStatement cstmt = conn.prepareCall("{call my_sp(?)"); cstmt.registerOutParame

我正在调用一个sp,但没有几个out参数,根据我的要求,我需要在某些条件下使用ResultSet,在其他条件下使用out参数。但使用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 close错误

ResultSetMetaData rsmd = rs.getMetaData();

是否有任何方法可以获取输出参数值,然后在ResultSet对象上迭代,或者反之亦然?

根据JDBC规范,必须在输出参数之前检索结果集

这是原始规格

7.1.7在结果之后检索出参数

由于某些DBMS施加的限制,建议在检索OUT参数之前,检索由CallableStatement对象的执行生成的ResultSet对象中的所有结果,以实现最大的可移植性。从结果集中检索到所有值后,方法ResultSet.next将返回false


如果CallableStatement对象返回多个ResultSet对象(仅当通过调用execute方法执行时才可能),则应在检索OUT参数之前检索所有结果。在这种情况下,为了确保所有结果都已被访问,需要调用语句方法getResultSet、getUpdateCount和getMoreResults,直到没有更多结果为止。当所有结果都已用尽时,getMoreResults方法返回false,getUpdateCount方法返回-1

我不熟悉syBase,
但可能您可以在MSSQL中输出类似以下StoredProcess的脚本:

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();
我以前在调用StoredProcess时也遇到过同样的问题, 就在几天前;)