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语句是一种糟糕的方法。它可能会导致性能和/或扩展问题。