oracle语句级触发器使用操作的历史数据
oracle语句级触发器使用操作的历史数据
在oracle中,触发器分为三类,行触发,语句触发、替代触发,这里讨论语句触发,因为在语句级触发器没有new和OLd可以访问历史数据,但是很多情况是必须使用这些刚刚更新或删除的数据进行其他操作,下面提供一种解决方法:首先定义一种表类型 的结构,然后创建一个行级触发器,这个触发器仅做一个操作,就是利用old、new记录刚刚操作的数据,然后创建一个语句级触发器,在这个语句级触发器里面执行相应的业务操作。具体实现如下:(两个表f分别为aaaa,aaaa_log,功能就是删除aaaa的数据记录到aaaa_log中)
-- 创建一个包 ,
create or replace package tri_pkg
as
type TempTable is table of aaaa%rowtype index by binary_integer ;
oldrows TempTable;
oldemptyrows TempTable;
end tri_pkg;
-- 做删除前清空初始化数据
create or replace trigger aaaa_delete_empty
before delete
on aaaa
begin
tri_pkg.oldrows:=tri_pkg.oldemptyrows;
end;
-- 行级触发器记录删除的记录
create or replace trigger aaaa_delete_row
AFTER delete
on aaaa
for each row
declare
num integer :=tri_pkg.oldrows.COUNT+1;
begin
tri_pkg.oldrows(num).name:=:old.name;
tri_pkg.oldrows(num).birthdate:=:old.birthdate;
end;
-- 语句触发器操作业务
create or replace trigger aaaa_delete
AFTER delete
on aaaa
declare
begin
for i in 1..tri_pkg.oldrows.COUNT loop
insert into aaaa_log(name,birthdate) select tri_pkg.oldrows(i).name ,tri_pkg.oldrows(i).birthdate
from dual;
end loop;
end;