2014-12-02 4 views
0

Я пишу простой триггер, который должен просто отправить сообщение с обновленным количеством строк, а также старым значением «Пол» и обновленным значением «Пол». Когда я запускаю обновление, однако я получаю ошибку, что таблица мутирует, и таблица, возможно, не сможет ее увидеть, но я не совсем уверен, почему.Oracle Mutating Trigger

триггер

create or replace trigger updatePERSONS 
after update 
on PERSONS 
for each row 
declare 
n int; 
oldGender varchar(20):= :OLD.Gender; 
newGender varchar(20):= :NEW.Gender; 

begin 
select Count(*) 
into n 
from PERSONS; 

if (oldGender != newGender) then 
dbms_output.put_line('There are now '|| n || ' rows after update. Old gender: ' || oldGender 
|| ', new Gender: ' || newGender); 

end if; 
End; 

`

я знаю, что он должен делать с отборным заявлением после того, как начать, но как еще я могу получить количество строк?

+0

Проблема заключается в том, что инструкция 'select count (*)' в триггере уровня строки не может ссылаться на таблицу, на которой вы создали триггер. Здесь вы создали триггер в таблице PERSONS, и вы пытаетесь извлечь данные из одной и той же таблицы внутри триггера, что не допускается в Oracle. – San

+0

ОК, я так понял. где я должен положить его вместо этого? или как еще я могу получить счет? – user3587186

ответ

2

Как указывает @San, триггер уровня на persons обычно не может запрашивать таблицу persons.

Вам понадобится два триггера, триггер уровня, который может видеть старый и новый пол и триггер уровня инструкции, который может выполнять подсчет. Вы также можете, если вы используете 11g, создать сложный триггер с блоками уровня строки и оператора.

create or replace trigger trg_stmt 
    after update 
    on persons 
declare 
    l_cnt integer; 
begin 
    select count(*) 
    into l_cnt 
    from persons; 

    dbms_output.put_line('There are now ' || l_cnt || ' rows.'); 
end; 

create or replace trigger trg_row 
    after update 
    on persons 
    for each row 
begin 
    if(:new.gender != :old.gender) 
    then 
    dbms_output.put_line('Old gender = ' || :old.gender || ', new gender = ' || :new.gender); 
    end if; 
end;