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中是不允许的。我应该把它放在哪里呢?或者我怎样才能得到计数?