Oracle 甲骨文变异触发器

Oracle 甲骨文变异触发器,oracle,triggers,Oracle,Triggers,我正在编写一个简单的触发器,它应该只发送一条消息,其中包含更新的行数、旧的性别值和更新的性别值。然而,当我运行一个更新时,我得到了一个错误,即表正在发生变化,表可能无法看到它,但我不知道确切的原因 触发 create or replace trigger updatePERSONS after update on PERSONS for each row declare n int; oldGender varchar(20):= :OLD.Gender; newGender varchar

我正在编写一个简单的触发器,它应该只发送一条消息,其中包含更新的行数、旧的性别值和更新的性别值。然而,当我运行一个更新时,我得到了一个错误,即表正在发生变化,表可能无法看到它,但我不知道确切的原因

触发

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;
`


我知道这与begin后的select语句有关,但我如何才能获得行数?

正如@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;

问题在于
selectcount(*)
语句,在行级触发器中,不能引用已创建触发器的表。在这里,您已经在PERSONS表上创建了触发器,并且正在尝试从触发器内的同一个表中获取数据,这在Oracle中是不允许的。我应该把它放在哪里呢?或者我怎样才能得到计数?