PL/SQL期末复习-触发器

Oracle触发器复习1

语句级触发器

语法格式

create or replace trigger mingzi
[after|before] on table
declare
begin
	
end mingzi;

使用最基本的语句级触发器测试触发器的执行过程。

删除之前的触发

create or replace trigger delete_trigger_emp
before delete on emp
begin
   dbms_output.put_line('准备执行删除操作');
end delete_trigger_emp;

删除之后的触发

create or replace trigger delete_trigger_emp1
after delete on emp
begin
   dbms_output.put_line('执行删除操作');
end delete_trigger_emp1;

在执行删除语句之后自动进行触发语句

delete from emp where empno='6003';

在这里插入图片描述

语句级触发器和游标的结合

使用游标,在删除了数据之后,使用游标+for循环的形式,完成语句的输出操作。

create or replace trigger delete_emp
after delete on emp
declare
  cursor emp_cursor is select empno,ename,sal from emp; 
begin
  dbms_output.put_line('执行了删除操作之前');
  for emp_record in emp_cursor loop
    dbms_output.put_line('员工编号是:'||emp_record.empno||'员工姓名是:'||emp_record.ename||'工资是:'||emp_record.sal);
  end loop;
end delete_emp;

删除6003编号触发器进行触发的结果为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTU3YAtV-1639300044937)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211212154010979.png)]

定义一个在删除emp表中数据之前使用游标输出所有信息的触发器

create or replace trigger delete_emp
before delete on emp
declare
  cursor emp_cursor is select empno,ename,sal from emp; 
begin
  dbms_output.put_line('执行了删除操作之前');
  for emp_record in emp_cursor loop
    dbms_output.put_line('员工编号是:'||emp_record.empno||'员工姓名是:'||emp_record.ename||'工资是:'||emp_record.sal);
  end loop;
end delete_emp;

因为是在删除之前执行的操作会输出删除之前的所有的信息。即删除之前的6003信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMUCGIq8-1639300044937)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211212154420822.png)]

触发器谓词

根据触发器的谓词信息,可以判断触发器的触发状态对不同的触发条件执行不同的触发操作。

插入后统计插入后的人数

删除后统计员工的最小的年龄

更新后输出员工的平均工资

pl/sql代码块的编写

create or replace trigger dml_emp
after delete or update or insert on emp
declare
  v_count number;
  v_sal emp.sal%type;
  v_age emp.age%type;
begin
  if inserting then
    select count(*) into v_count from emp;
    dbms_output.put_line('插入之后总数为:'||v_count);
  elsif deleting then
    select min(age) into v_age from emp;
    dbms_output.put_line('删除之后的最小年龄为:'||v_age);
  elsif updating then
    select avg(sal) into v_sal from emp;
    dbms_output.put_line('更新之后的平均工资为'||v_sal);
  end if;
end dml_emp;

插入一条数据测试

--插入数据触发 插入后的总数为3
set serveroutput on;
insert into emp values(6003,'xiaoli','女',21,'职员','',900,'');

修改一条数据测试

--更改数据的触发
set serveroutput on;
update emp set ename='小李' where empno='6003';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZuLxpJY-1639300044939)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211212161125965.png)]

删除一条数据的测试

--删除数据触发测试
set serveroutput on;
delete from emp where empno=6002;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBPWmgcM-1639300044941)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211212161432912.png)]

行级触发器

行级触发器的定义:使用了for each row选项表示该触发器为行级触发器

不同:与语句级别的触发器相比,DML语句触发影响多个行时,每一行行级触发器都会触发一次

语法格式

create or replace trigger xxx
[before|after] trigger_event [or trigger_event2]..[of column_name]
on table name
for each row
where [condition]
pl/sql

行级触发器的入门的程序

create or replace trigger update_student
after update on emp
for each row
begin
  dbms_output.put_line('执行了一次更新操作');
end update_student;

行级触发器的标识符

create or replace trigger update_stu
after update on student
for each row
begin
  dbms_output.put_line('修改前学生的学号为'||:old.sno);
  dbms_output.put_line('修改后学生的学号为'||:new.sno);
  dbms_output.put_line('修改前系别为:'||:old.dept);
  dbms_output.put_line('修改后系别为:'||:new.dept);
end update_stu; 

如果使用before条件触发,换成before条件出触发之后条件依然满足不会出现报错。

select * from student;
create or replace trigger update_stu
before update on student
for each row
begin
  dbms_output.put_line('修改前学生的学号为'||:old.sno);
  dbms_output.put_line('修改后学生的学号为'||:new.sno);
  dbms_output.put_line('修改前系别为:'||:old.dept);
  dbms_output.put_line('修改后系别为:'||:new.dept);
end update_stu; 

set serveroutput on;
update student set dept='数科系' where dept='数学系';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xp6kacRe-1639300044942)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211212170030561.png)]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值