2011-04-05 41 views
1

我打電話給一個帶有幾個輸出參數的sp,按照我的要求,我需要在某些條件下使用ResultSet,並在其他條件下使用參數。但是用的executeQuery(),我得到,JZ0R0:ResultSet中已經關閉的錯誤(我用的Sybase 15)JDBC executeQuery()同時返回ResultSet和輸出參數

這裏是例子:

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

根據JDBC規範,必須取得結果之前輸出參數設置

原來這裏是規範

7.1.7檢索OUT參數後,結果

由於某些DBMS的限制爲了獲得最大的可移植性,建議在檢索OUT參數之前檢索由執行CallableStatement對象所生成的ResultSet對象中的所有結果。當從結果集中檢索到所有值時,方法ResultSet.next將返回false。

如果CallableStatement對象返回多個ResultSet對象(只有在調用方法execute時纔可能執行),則應在檢索OUT參數之前檢索所有結果。在這種情況下,爲確保所有結果都已被訪問,需要調用Statement方法getResultSet,getUpdateCount和getMoreResults,直到沒有更多結果。當所有結果都用盡時,方法getMoreResults返回false,並且方法getUpdateCount返回-1。

0

我不熟悉Sybase,
但可能是你可以像這樣的StoredProcedure在MSSQL輸出腳本:

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(); 

我曾經有:

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代碼去調用StoredProcedure之前的相同問題, 以及它僅僅是幾天前;)