oracle数据库内置账号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_poracle账号kg.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;

此条目发表在oracle metalink账号分类目录,贴了标签。将固定链接加入收藏夹。