我有一个触发器如下:
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
或省略了异常块,但它不起作用。我想知道问题出在哪里。
答案 0 :(得分:2)
你可以将动作放在异常的“CATCH”部分。
BEGIN
SELECT fooID into dummy
FROM Foo
WHERE FooID = :new.FooID;
--action1
EXCEPTION
WHEN NO_DATA_FOUND THEN
--action2
END
答案 1 :(得分: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;
-- ...
代替。
答案 2 :(得分: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;