Oracle Mutating Trigger

时间:2014-12-02 19:02:46

标签: oracle triggers

我正在编写一个简单的触发器,它应该只发送一条消息,其中包含更新的行数,以及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语句有关,但我怎么会得到行数呢?

1 个答案:

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