2011-04-05 3 views
1

필자는 필자의 요구 사항에 따라 일부 sp를 호출하고 일부 조건에서는 ResultSet을 사용하고 다른 조건에서는 params를 사용해야합니다. 그러나하는 executeQuery()를 사용하여, 나는 점점 오전 JZ0R0 : ResultSet의가 이미되어 폐쇄 된 오류 (나는베이스 (15)를 사용하고 있습니다) 여기 ResultSet과 출력 매개 변수를 모두 반환하는 JDBC executeQuery()

은 예입니다.

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에 따르면 당신이 출력 매개 변수 전에 결과 집합을 검색해야합니다 SPEC

여기

7.1.7 OUT 매개 변수를 검색 원래 사양을 한 후 때문에 일부 DBMS에 의해 부과 된 제한의 결과

최대의 이식성을 확보하기 위해서, CallableStatement 객체의 실행에 의해 생성 된 ResultSet 객체 내의 모든 결과를, OUT 파라미터를 취득하기 전에 취득 할 필요가있는 것을 추천합니다. 모든 값이 결과 집합에서 검색되면 ResultSet.next 메서드는 false를 반환합니다.

CallableStatement 객체가 복수의 ResultSet 객체를 돌려주는 경우 (execute 메소드를 호출 해 실행하는 경우만 가능합니다), OUT 파라미터를 취득하기 전에 모든 결과를 취득 할 필요가 있습니다. 이 경우 모든 결과에 액세스했는지 확인하려면 Statement 메소드 getResultSet, getUpdateCount 및 getMoreResults를 더 이상 결과가 없을 때까지 호출해야합니다. 모든 결과가 없어지면 getMoreResults 메소드는 false를 리턴하고 getUpdateCount 메소드는 -1을 리턴합니다. 내가 SYBASE에 익숙하지 않은 오전

0

,
하지만 출력 MSSQL이의 StoredProcedure 같은 스크립트 수있을 수 있습니다 : 나는 한 번이되었다

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 

을 가서 이전에 StoredProcedure를 호출 할 때와 동일한 문제가 발생했습니다 ( ).