所谓触发器就是在执行某个操作(增删改)的时候触发一个动作(一段程序)。
基础语法
CREATE [or REPLACE] TRIGGER 触发器名
{BEFORE | AFTER} --该触发器是在curd之前还是之后执行的
{DELETE | INSERT | UPDATE [OF 列名]} --触发动作删、增、改 ,of 列名 是指可以指定哪列操作时触发,若不指定,默认对任何列操作都触发。
ON 表名 --此触发器用于哪个表
[FOR EACH ROW [WHEN(条件) ] ]对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。WHEN(条件) 条件是布尔表达式,只有满足条件才会触发此触发器。
PLSQL 块
例1:在更改学生年龄时同时打印年龄年龄成功
建表语句
create table tstudent(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
ssex varchar2(5)
);
insert into tstudent values ('s001','张三',23,'男');
insert into tstudent values ('s002','李四',23,'男');
insert into tstudent values ('s003','王二麻子',25,'男');
insert into tstudent values ('s004','小明',20,'女');
insert into tstudent values ('s005','小红',20,'女');
insert into tstudent values ('s006','小黑',21,'男');
insert into tstudent values ('s007','小黄',21,'男');
insert into tstudent values ('s008','小绿',21,'女');
insert into tstudent values ('s009','小白',23,'女');
insert into tstudent values ('s010','小紫',22,'女');
commit
触发器
Statement level 是语句级的意思
Second was the statement level trigger that you have just shown. By the time I came back, you are already there with the solution.
理工科一定要好好掌握数学和英语啊,否则发展极其受限…
create or replace trigger teststudent
after update
on tstudent
for each row --对表的每一行触发器执行一次
declare
begin
--select * from inserted;
dbms_output.put_line(:old.sname||'将年龄更改为'||:new.sage||'更改前年龄为'||:old.sage);
end teststudent;
在Oracle的触发器中,没有inserted和deleted这两张表来查询更新前后的数据,取而代之的是:new和:old两个“对象”。
之所以称之为“对象”,是因为它们跟ORM中的映射对象的作用十分相似,都是存储表中一行记录的所有字段的信息,并且用使用属性的方式获取每个字段的值。
不过这个对象每次只能保存一条记录的信息而已。
对应关系为:
inserted --> :new 更新后的数据
deleted --> :old 更新前的数据
update tstudent t set t.sage = 28 where t.sname ='张三'
例2:给学生年龄加上限制条件,小于10岁不给更新
create or replace trigger teststudent1
before update
on tstudent
for each row
declare
-- local variables here
begin
if :new.sage<10 then
--抛出异常 终止程序继续运行,也就终止了更新操作了
raise_application_error(-20001,'年龄太小不做更改');
end if;
end teststudent1;
update tstudent t set t.sage = 1 where t.sname ='张三'
--查看用户触发器
select * from user_triggers;
注意:触发器会引起锁,降低效率!使用时要慎重。如无必要,尽量不要使用触发器。
行级触发器会引发行级锁(锁行数据)
语句级触发器可能会引起表级锁(锁表)
博客语法高亮展示
需要在第一行代码块后面加上语言
如