oracle 触发器的使用

所谓触发器就是在执行某个操作(增删改)的时候触发一个动作(一段程序)。

在这里插入图片描述

基础语法

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;

注意:触发器会引起锁,降低效率!使用时要慎重。如无必要,尽量不要使用触发器。
行级触发器会引发行级锁(锁行数据)
语句级触发器可能会引起表级锁(锁表)

博客语法高亮展示
需要在第一行代码块后面加上语言

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值