0

私はこのトリガーを持っています:

CREATE OR REPLACE TRIGGER trig_update_process_info
  AFTER INSERT ON rocessstep FOR EACH ROW
DECLARE
  audit_time TIMESTAMP(6);
  found_flag NUMBER DEFAULT 0;
BEGIN

  SELECT MAX(lastupdatetime) INTO audit_time
    FROM processinfo
   WHERE instance = :new.instance;

EXCEPTION
  WHEN no_data_found THEN
    found_flag := NULL;

    IF found_flag IS NULL
    THEN
      INSERT INTO processinfo
       VALUES (:new.instance, :new.step, :new.status, :new.iteration, :new.audittime);
    ELSE
      IF :new.audittime > audit_time
      THEN
        UPDATE processinfo
        SET step = :new.step, lastupdatetime = :new.audittime, status = :new.status, iteration = :new.iteration
        WHERE instance = :new.instance;
      END IF;
    END IF;
END;

しかし、それは機能していません。このトリガーの何が問題なのか教えていただけますか?

ターゲットテーブルは次のとおりです。

CREATE TABLE PROCESSINFO(
    インスタンス CHAR(36 バイト) NOT NULL、
    STEP VARCHAR2(128バイト) NOT NULL,
    ステータス番号(*,0) NULL ではありません。
    反復数(*,0) NULL ではありません。
    LASTUPDATETIME TIMESTAMP(6) NOT NULL
);

ありがとう

4

1 に答える 1

1

no_data_found集計のためにクエリがスローされることはありません。代わりに、一致するデータがない場合はaudit_timenull になるため、代わりにそれをテストできます。a はまったく必要ありませんfound_flag。そして、書かれているように、if/else セクション全体が例外ハンドラー内にあるため、評価することはできません (おそらく、例外がスローされない場合は else 部分にヒットすることを期待していますが、個別の begin/end はありません)。そのため、ブロックが正しく構造化されていません)。

...
BEGIN
  SELECT MAX(LASTUPDATETIME) INTO AUDIT_TIME FROM PROCESSINFO
  WHERE INSTANCE = :NEW.INSTANCE;

  IF AUDIT_TIME IS NULL 
  THEN
    INSERT INTO PROCESSINFO (INSTANCE, STEP, STATUS, ITERATION, LASTUPDATETIME)
      VALUES (:NEW.INSTANCE, :NEW.STEP, :NEW.STATUS, :NEW.ITERATION, :NEW.AUDITTIME);
  ELIF :NEW.AUDITTIME > AUDIT_TIME THEN 
    UPDATE PROCESSINFO SET STEP = :NEW.STEP, LASTUPDATETIME = :NEW.AUDITTIME,
      STATUS = :NEW.STATUS, ITERATION = :NEW.ITERATION
    WHERE INSTANCE = :NEW.INSTANCE;
  END IF;
END;

processinfoいずれにせよ、それぞれに 1 つの行しかないと予想されるように見えるinstanceので、更新するか挿入するかを選択する代わりに、マージ ステートメントを検討することもできます。

これON ROCESSSTEPも奇妙に見えますが、そのテーブル名が間違っていると、「機能しない」だけでなく、トリガーがまったく作成されません。

于 2015-10-20T10:31:12.947 に答える