Oracle PL/SQL中的触发器

时间:2021-08-04作者:klpeng分类:IT综合浏览:218评论:0

        sql语句的执行一般都是一条一条的,当我们想执行了某一条sql语句时,会自动执行某些事件,这个时候就可以用到触发器。触发器顾名思义就是一件事的发生会被触发产生某一个事件。

        创建了某触发器时,当执行的sql语句符合条件就会自动执行触发器里面的内容。

        

1.创建触发器

        跟创建表很类似。 其中trigger单词有触发的意思


     

   create or replace trigger 触发器名  

   before/after  触发的原因 on 表名
    
   for each row
   
   begin

        触发器所需要执行的内容        

   end;

        

        其中: 

        before/after :  顾名思义选择了before就是执行了触发该操作之前执行触发器里的内容,after就是之后。

        触发的原因: 就是该表执行了某些sql动作,如delete ,insert ,  update 。允许多个动作的存在,也正因为每条sql语句只有删除,插入,更新,所以多个动作的出现的关系也只有or 。如 delete or insert 。  也正是对于表的数据的处理能够影响到数据 也只有 增 删 改  

        触发器所需要执行的内容: 当执行的sql语句符合触发器触发的动作,就会自动执行begin与end之间的内容。

        

        举个例子,创建一个Person表,里面有姓名和年龄,在创建一个person_record记录表,里面有status状态值和sdate操作时间。当status表示Person表数据插入删除更新的情况,status = 1时,认定为Person插入了新的数据。下面实现该触发器。

        创建Person表,person_record表

create table Person(
       pname varchar2(10) not null,
       page number(3) not null,
       pid number(5) unique 
);

create table person_record(
       status int ,
       sdate date

);

        创建person_after_insert触发器

   

create or replace trigger person_after_insert
after insert on Person
for each row
begin 
  insert into person_record(status,sdate) values(1,sysdate);
end;

我们来进行测试一下。

首先查看person_record表,目前是空表。

select * from person_record;

 Oracle PL/SQL中的触发器

当我们执行对Person表进行数据插入时:

insert into Person(cname,cage) values('大白',20);

 我们再次查询person_record表就会新插入一条数据。

Oracle PL/SQL中的触发器

另外对其表的更新删除数据的触发器大同小异,只需要更改insert为update或delete即可。

        此外,当触发器响应的行为是update时,就是更新表的数据,可以更改一行数据,也可以更改多行数据。当修改表中n行的数据时,触发器begin与end间的内容就会被执行n次。

        比如,依旧保存上述的Person和person_record表,认为person_record表中的status=0为Person表被修改。 我们创建一个person_after_update触发器,用来自动触发修改表的数据要执行的内容。对Person表进行年龄或者姓名修改,创建一个person_update表,记录Person表修改数据前后的姓名和年龄。

        当需要得到表修改数据的行的修改前和修改后的数据就需要用到:old 虚拟表和:new 表 来访问。:old 的值为只读,:new的值可修改update修改的字段   访问数据的格式为:old.字段名  ,:new.字段名

        创建person_update表

create table person_update(
       poldname varchar2(100) ,
       pnewname varchar2(100),
       poldage number(2),
       pnewage number(2)
);

        创建person_after_update触发器

create or replace trigger person_after_update
after update on Person
for each row 
begin 
  insert into person_update values(:new.cname,:old.cname,:old.cage,:new.cage);

  insert into person_record(status,sdate) values(0,sysdate);

end;

        执行上述语句之后,我们来进行一下测试。

       查看Person 表,person_update表,

Oracle PL/SQL中的触发器

Oracle PL/SQL中的触发器

         

写入对Person表的更新操作

对一行数据的更新

update Person set cage = 66 where cname = '新手';

对多行数据的更新

update Person set cage = 88 where cname = '大白';

 执行完了之后,查看person_update,person_record两表

Oracle PL/SQL中的触发器

 上述图,对其两个更新操作有重复执行了一次。Oracle PL/SQL中的触发器

2.删除触发器

删除触发器与删掉表很像。drop trigger 触发器名

例如,我们将其上述创建的person_after_insert触发器删掉

drop trigger person_after_insert;

    

打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢