0

次のようなトリガーがあります。

CREATE OR REPLACE TRIGGER trig
BEFORE INSERT ON table
FOR EACH ROW

DECLARE
dummy CHAR(30);

BEGIN

SELECT fooID into dummy
FROM Foo
WHERE FooID = :new.FooID;

IF SQL%FOUND THEN 
    --action 1...
ELSE
    --action 2...
END IF;

EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR( -20001, 'NO DATA');

END;
/

テーブルでレコードが見つかったときにトリガーが機能するようにしたいのですが、Fooアクション1を実行するか、アクション2を実行できますが、テーブル内のレコードが見つからない場合、トリガーはNO_DATA_FOUND例外に直接進みFooます。

つまり、テストするときに、レコードが見つかった場合はアクション 1 を実行し、そうでない場合はアクション 2 をスキップして に移動しますがNO_DATA_FOUND、これは私が望んでいるものではありません。

また、例外ブロックを試したり省略ELSIFしたりしましNOT SQL%FOUNDたが、機能しません。どこで問題が発生しているのか気になります。

4

3 に答える 3

2

例外の「CATCH」部分にアクションを入れることができます。

BEGIN

SELECT fooID into dummy
FROM Foo
WHERE FooID = :new.FooID;
--action1
EXCEPTION
WHEN NO_DATA_FOUND THEN
--action2
END
于 2013-07-26T16:21:26.927 に答える
1

試す

l_count   BINARY_INTEGER;
...
SELECT count(*)
  INTO l_count
  FROM Foo
 WHERE FooID = :new.FooID
     ;

IF l_count > 0 THEN
    -- action 1
ELSE
    -- action 2
END IF;
-- ...

代わりは。

于 2013-07-26T16:21:44.630 に答える