1

アプリケーションからプロシージャを呼び出そうとすると、ORA-01002: fetch out of sequenceというエラーが発生しました

使用技術:

  • マイバティス 3
  • 春のMVC

ここで興味深いのは、サービス クラスの呼び出しメソッドに@Transactional (org.springframework.transaction.annotation.Transactional) アノテーションを使用した場合にのみエラーが発生することです。@Transactionalを削除すると、ORA エラーは発生しません。

サービスに複数の DAO を挿入しているため、@Transactional を使用しています。以下に貼り付けた私のコードを見つけてください。

@Transactional
    public boolean saveavgFlyHrs(AverageFlyingHoursReport averageFlyingHoursReport) throws TransactionDataException {
        String status = null;
        boolean isOk = false;
        if(averageFlyingHoursReportDAO.saveavgFlyHrs(averageFlyingHoursReport)) {
            status = averageFlyingHoursReportDAO.updateCheckEff(averageFlyingHoursReport.getSubFleet());
            logger.debug("OUT_STATUS:"+status);
            if(ConstantStringUtil.SUCCESS.equalsIgnoreCase(status)) {
                isOk = true;
            } else {
                isOk = false;
            }
        }
        return isOk;
    }

誰でもこれで私を助けてください。

4

1 に答える 1

5

ORA-01002オラクルのエラーです。Oracle コードを示していないため、何が起こるかを推測する必要があります。

FOR UPDATEこのエラーは通常、カーソルを越えてコミットしたときにスローされます。次に例を示します。

SQL> CREATE TABLE TEST (ID NUMBER, c VARCHAR2(10));

Table created

SQL> INSERT INTO TEST VALUES (1, 'a');

1 row inserted

SQL> INSERT INTO TEST VALUES (2, 'b');

1 row inserted

SQL> BEGIN
  2     FOR cc IN (SELECT * FROM TEST FOR UPDATE) LOOP -- FOR UPDATE cursor
  3        UPDATE TEST SET c = UPPER(c) WHERE ID = cc.id;
  4        COMMIT; -- this will invalidate our cursor
  5     END LOOP;
  6  END;
  7  /

ORA-01002: fetch out of sequence
ORA-06512: at line 3

@Transactional作業単位に追加すると、成功時にコミットされ、エラー時にロールバックされると想像できます。したがって、このコードは、FOR UPDATEある種のカーソルを使用するより大きなループの一部である可能性があります。を追加する@Transactionalと、メソッドが呼び出されるたびにコミットされるため、メイン カーソルが無効になります。

ORA-01002また、カーソルを無効にする変更の一部をロールバックした後にカーソルからフェッチしようとすると、次のような問題が発生する可能性があります。

SQL> DECLARE
  2     CURSOR cc IS SELECT * FROM TEST;
  3     rc cc%ROWTYPE;
  4  BEGIN
  5     UPDATE TEST SET c = 'c' WHERE ID = 2;
  6     OPEN cc;
  7     FETCH cc INTO rc;
  8     -- do other things
  9     ROLLBACK;
 10     FETCH cc INTO rc;
 11  END;
 12  /

ORA-01002: fetch out of sequence
ORA-06512: at line 11

ここでccは、カーソル内の行に影響を与える変更の一部をロールバックしたため、カーソルが無効になっています。これは@Transactional、別のカーソルがまだフェッチされている間にトランザクションを追加し、メソッドがロールバックしたことが原因である可能性があります。

結論として@Transactional、分割できない量の作業を行うユニットにのみ追加する必要があります。メソッドがより大きなトランザクションのサブメソッドである場合、単独でコミット/ロールバックしないでください。

于 2013-09-04T08:25:38.780 に答える