sql if else替代操作

时间:2013-07-26 16:17:34

标签: 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;

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

3 个答案:

答案 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;