2013-07-26 2 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, что не то, что я хочу.

Я также пробовал ELSIF на NOT 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;