我正在编写一个简单的触发器,它应该只发送一条消息,其中包含更新的行数,以及Gender的旧值和Gender的更新值。当我运行更新但是我收到表错误的错误,表可能无法看到它,但我不确定为什么。
触发
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;
`
我知道它在开始后与select语句有关,但我怎么会得到行数呢?
答案 0 :(得分: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;