1

私はいくつかの out パラメータで 1 つの sp を呼び出しています。私の要件に従って、ある条件で ResultSet を使用し、他の条件で out パラメータを使用する必要があります。しかし、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には制限があるため、移植性を最大限に高めるために、CallableStatementオブジェクトの実行によって生成されたResultSetオブジェクトのすべての結果を、OUTパラメーターを取得する前に取得することをお勧めします。結果セットからすべての値が取得されると、メソッドResultSet.nextはfalseを返します。

CallableStatementオブジェクトが複数のResultSetオブジェクトを返す場合(これは、executeメソッドの呼び出しで実行された場合にのみ可能です)、OUTパラメーターを取得する前にすべての結果を取得する必要があります。この場合、すべての結果にアクセスしたことを確認するには、結果がなくなるまで、StatementメソッドgetResultSet、getUpdateCount、およびgetMoreResultsを呼び出す必要があります。すべての結果が使い果たされると、メソッドgetMoreResultsはfalseを返し、メソッドgetUpdateCountは-1を返します。

于 2011-04-07T05:31:07.417 に答える
0

私はsyBaseに精通していません
が、この StoredProcedure in MSSQL のようなスクリプトを出力できるかもしれません:

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 に答える