sql if else替代操作
我有一个触发器,如下所示:sql if else替代操作,sql,oracle,select,if-statement,Sql,Oracle,Select,If Statement,我有一个触发器,如下所示: 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; EXCEPTI
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。但是当Foo
表中的记录未找到时,触发器直接转到NO\u DATA\u FOUND
异常
这意味着,当我测试它时,如果找到记录,它将执行操作1,如果没有,它将跳过操作2并转到NO\u DATA\u found
,这不是我想要的
我还在
notsql%FOUND
上尝试了ELSIF
,或者忽略了异常块,但它不起作用。我想知道问题出在哪里 您可以在异常的“CATCH”部分中设置操作do
BEGIN
SELECT fooID into dummy
FROM Foo
WHERE FooID = :new.FooID;
--action1
EXCEPTION
WHEN NO_DATA_FOUND THEN
--action2
END
您可以在异常的“CATCH”部分执行操作
BEGIN
SELECT fooID into dummy
FROM Foo
WHERE FooID = :new.FooID;
--action1
EXCEPTION
WHEN NO_DATA_FOUND THEN
--action2
END
试一试
相反。试试看
相反。你可以试试这个
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;
你可以试试这个
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;
如果下面还有更多的select语句,我可能需要1个以上的
EXCEPTION
@HolaAmigos,是的,当然。您可以根据需要拥有任意多个BEGIN EXCEPTION END
块。但很难说“像这样”应该如何解决这个问题。@HolaAmigos您也可以有一个变量,如果引发异常或未引发异常,则设置不同的值,并在“所有捕获的异常”(不确定这是否真的很清楚;)之后应用您的操作。但触发器中是否可能有多个开始-结束
块?它给了我一个错误:“在我的第一个块之后遇到了符号“BEGIN””。你可以在触发器块中嵌套匿名块。然而,我会质疑设计。每当触发器触发时执行多个SELECT语句是一种糟糕的方法。它可能会导致性能和/或缩放问题。如果下面还有更多select语句,我可能需要超过1个异常
@HolaAmigos是的,当然。您可以根据需要拥有任意多个BEGIN EXCEPTION END
块。但很难说“像这样”应该如何解决这个问题。@HolaAmigos您也可以有一个变量,如果引发异常或未引发异常,则设置不同的值,并在“所有捕获的异常”(不确定这是否真的很清楚;)之后应用您的操作。但触发器中是否可能有多个开始-结束
块?它给了我一个错误:“在我的第一个块之后遇到了符号“BEGIN””。你可以在触发器块中嵌套匿名块。然而,我会质疑设计。每当触发器触发时执行多个SELECT语句是一种糟糕的方法。它可能会导致性能和/或扩展问题。