Oracle PL/SQL中的触发器
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;
当我们执行对Person表进行数据插入时:
insert into Person(cname,cage) values('大白',20);
我们再次查询person_record表就会新插入一条数据。
另外对其表的更新删除数据的触发器大同小异,只需要更改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表,
写入对Person表的更新操作
对一行数据的更新
update Person set cage = 66 where cname = '新手';
对多行数据的更新
update Person set cage = 88 where cname = '大白';
执行完了之后,查看person_update,person_record两表
2.删除触发器
删除触发器与删掉表很像。drop trigger 触发器名
例如,我们将其上述创建的person_after_insert触发器删掉
drop trigger person_after_insert;
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。