2013-07-26 55 views
0

我有一个触发如下:SQL,如果其他替代行动

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或省略例外块,但它不起作用。我想知道问题出在哪里。

回答

2

您可以将操作放在您的例外的“CATCH”部分。

BEGIN 

SELECT fooID into dummy 
FROM Foo 
WHERE FooID = :new.FooID; 
--action1 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
--action2 
END 
+0

如果我仍然有低于更多选择语句,我可能需要超过1'EXCEPTION' –

+1

@HolaAmigos嗯,是的,当然。您可以根据需要选择尽可能多的'BEGIN EXCEPTION END'块。但很难说“就像这样”,你应该如何解决这个问题。 –

+0

@HolaAmigos你也可以有一个变量,如果异常被引发或者没有设置一个不同的值,并且在“所有捕获到的异常”之后应用你的动作(不确定这是否真的很清楚))。 –

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; 
-- ... 

代替。

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;