1

Strutsフレームワークを使用しています。「カーソルが閉じています」というエラーが発生します。ストアドプロシージャを確認しましたが、Oracleで正常に機能していますが、「カーソルが閉じています」というエラーが発生します。

    のせいで:
java.sql.SQLException:カーソルが閉じています。
    oracle.jdbc.driver.T4CResultSetAccessor.getCursor(T4CResultSetAccessor.java:323)で
    oracle.jdbc.driver.ResultSetAccessor.getObject(ResultSetAccessor.java:85)で
    oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1401)で

これを引き起こした原因を理解するのを手伝ってもらえますか?

4

4 に答える 4

2

コードを提供していないので、私の仮定によれば、プロシージャを開いてカーソルを返すことになりますが、同時に同じプロシージャでカーソルを閉じる可能性があります。

PROCEDURE S_S_TEST( 
  test_OUT OUT OAS_TYPES.REFCURSOR
) 
AS
BEGIN
  OPEN test_OUT FOR      
      SELECT *
      FROM table_p;
   CLOSE test_OUT;
END S_S_TEST;

ストアドプロシージャを呼び出すクライアントは、カーソルを閉じる責任があります。コードを削除してください:CLOSE test_OUT;

参照:カーソルが閉じています

于 2012-04-25T10:27:15.557 に答える
0

以下の問題のしばらくが来るでしょう

元:

while (rs.next()) {


            registartionServices.add(new RegistrationServices(rs.getString(1), rs.getString(2), rs.getString(3),
                    rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9)));
            noti[i] rs.getString(1);
            //System.out.println("amountList-" + rs.getString(7));
            //amountList.add(rs.getString(7));
            //serviceList.add(rs.getString(6));
            //serviceListAR.add(rs.getString(6));
            i++;
        }

上記の例では、(rs.getString(1))が2回アクセスしようとしています。

この代わりに、(rs.getString(1))を1つの変数に割り当て、その値を使用します。

元:

while (rs.next()) {
                notid=rs.getString(1);
                registartionServices.add(new RegistrationServices(notid, rs.getString(2), rs.getString(3),
                        rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9)));
                noti[i] =notid;
                //System.out.println("amountList-" + rs.getString(7));
                //amountList.add(rs.getString(7));
                //serviceList.add(rs.getString(6));
                //serviceListAR.add(rs.getString(6));
                i++;
            }

あなたが答えを得たことを望みます。

于 2014-06-24T05:51:08.067 に答える
0

特定のSQLクエリのカーソルを開くまで、最初はREF_CURSORは閉じた状態です。カーソルを開く前にいくつかの条件のためにカーソルを開いたことがない場合、このカーソルが閉じたSQLエラーが発生することがあります。その条件が満たされない場合、意図的にいくつかのダミー値のカーソルを開かないと、カーソルが開かれることはありません。次に例を示します。

IF condition = TRUE THEN
    OPEN CURSOR cursor_name FOR
    SELECT * FROM table_name;
END IF;

しかし、ここでは、条件はFALSEです。したがって、プロシージャは開いていないカーソルを返します。このような状況では、プログラムの呼び出しからこの特定の例外をキャッチすることを好みます。たとえば、以下は特定のタイプの例外をキャッチしてサイレントにするJavaコードです。

try
{
    cursor = (ResultSet) stmt.getObject(x);
}
catch(SQLException e)
{
    if (!e.getMessage().toLowerCase().contains("cursor is closed")) {
        e.printStackTrace();
    }
}

する代わりに

try
{
    cursor = (ResultSet) stmt.getObject(x);
}
catch(SQLException e)
{
    e.printStackTrace();
}
于 2018-01-02T02:31:49.317 に答える
0

プロシージャの出力パラメータをカーソルとして呼び出し元に戻すことはできますがOPEN RESULT FOR SELECT * FROM TABLE_NAME、プロシージャ内の出力パラメータカーソル()を開く/追加するのを見逃す可能性があります。

Example:
PROCEDURE TEST(RESULT OUT SYS_REFCURSOR) 
AS
BEGIN
  --your all codes
  OPEN RESULT FOR  SELECT * FROM TABLE_NAME;
END TEST;
于 2020-01-12T12:46:30.300 に答える