4

トリガーでサブクエリを許可しないという Oracle の制限を回避するにはどうすればよいですか。

作成しようとしているトリガーの例を次に示しますが、サブクエリを使用できないため作成できません。

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
  AND (SELECT offer FROM projects WHERE projnum = :new.projnum) IS NULL
)
BEGIN
  INSERT INTO offer_log (offer, status, date)
  VALUES (null, 9, sysdate);
END;
4

3 に答える 3

9

このトリガーはそれを行います:

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1
)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer INTO l_offer 
  FROM projects 
  WHERE projnum = :new.projnum;

  IF l_offer IS NULL THEN
    INSERT INTO offer_log (offer, status, date)
    VALUES (null, 9, sysdate);
  END IF;
END;

プロジェクトからの選択では常に行が見つかると想定しています。そうでない場合は、処理が必要な NO_DATA_FOUND 例外が発生します。

于 2009-05-26T09:09:08.320 に答える
5

私はあなたが次のようなものを望んでいることを期待しています

CREATE OR REPLACE TRIGGER trigger_w_subquery
AFTER UPDATE OR INSERT ON project_archiving
FOR EACH ROW 
WHEN (old.archiving_status <> new.archiving_status
  AND new.archiving_status = 1)
DECLARE
  l_offer projects.offer%TYPE;
BEGIN
  SELECT offer 
    INTO l_offer
    FROM projects 
   WHERE projnum = :new.projnum;

  IF( l_offer IS NULL )
  THEN
    INSERT INTO offer_log (offer, status, date)
      VALUES (null, 9, sysdate);
  END IF;
END;
于 2009-05-26T09:08:58.790 に答える
2

「発火するかどうか」ではなく、条件をアクション (BEGIN と END の間) に入れることはできますか? はい、それはトリガー本体がより頻繁に起動される可能性があることを意味します-しかし、それで問題を回避できれば...

于 2009-05-26T06:25:49.133 に答える