2012-05-31 2 views
0

у меня есть такой триггер, проверить, если поле равно нулю:триггер, если еще

create or replace trigger trig1 
after insert on table_1 
for each row 
begin 
if ((select table2.column2 from table2 where table2.id= :new.id) isnull) then 
update table2 set table2.column2 = :new.column1 where table2.id = :new.id; 
end if; 
end trig1; 
. 
run; 

Я получаю сообщение об ошибке, что триггер не создается правильно. Я не знаю, в чем проблема. Я использую Oracle SQL * Plus 10.2.0

+2

Не могли бы вы предоставить нам код ошибки/messsage? – Timst

+0

для моего триггера нет сообщения об ошибке, это только предупреждение, в котором говорится, что триггер создается с ошибками компиляции. –

ответ

7

Синтаксис PL/SQL не включает включение операторов SQL в предложение IF.

Правильный подход заключается в том, чтобы отделить инструкцию SELECT, а затем проверить ее результат. Так что было бы:

create or replace trigger trig1 
after insert on table_1 
for each row 
declare 
    v table2.column2%type; 
begin 
    select table2.column2 
    into v 
    from table2 
    where table2.id= :new.id; 

    if v is null 
    then 
     update table2 
     set table2.column2 = :new.column1 
     where table2.id = :new.id; 
    end if; 
end trig1; 

Обратите внимание, что это не обрабатывает существование нескольких строк в table2 не соответствующие критериям, или действительно там быть соответствующих строк. Он также не обрабатывает блокировку.

Кроме того, имейте в виду, что такой код плохо работает в многопользовательских средах. Вот почему я упомянул о блокировке. Вы должны использовать процедурную логику для обработки таких требований. Хотя, как это часто бывает с плохо продуманными триггерами, реальный виновник является плохой моделью данных. table2.column2 должно быть нормализовано.

+0

он не работает - он говорит мне, что строка «триггер не создана правильно». 4. –

+0

Мы не телепатически. Вы должны сообщить нам подробности. Запустите команду SQL * PLUS 'show error' или используйте этот запрос:' select * from user_errors'. – APC

+0

Это хорошая идея для просмотра ошибок, но эти команды говорят, что ошибок нет. Я не знаю, почему. когда я пытаюсь запустить триггер, он показывает ошибку: «ORA-04079» указывает на «v table2.column2% type;» строка 4. Это все. –

Смежные вопросы