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,这不是我想要的。

我也尝试过ELSIFNOT 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 回答
0

你可以试试这个

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

DECLARE
dummy CHAR(30) := NULL; -- initialize your variables ever;

BEGIN

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

IF dummy IS NOT NULL THEN 
    --action 1...
ELSE
    --action 2...
END IF;

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

END;
于 2013-07-26T16:25:34.823 回答