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

时间:2011-04-05 17:18:54

标签: jdbc resultset executequery

我正在调用一个没有参数的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对象,反之亦然?

2 个答案:

答案 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之前遇到同样的问题, 它就在几天前;)