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编号触发器进行触发的结果为:
定义一个在删除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信息
触发器谓词
根据触发器的谓词信息,可以判断触发器的触发状态对不同的触发条件执行不同的触发操作。
插入后统计插入后的人数
删除后统计员工的最小的年龄
更新后输出员工的平均工资
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';
删除一条数据的测试
--删除数据触发测试
set serveroutput on;
delete from emp where empno=6002;
行级触发器
行级触发器的定义:使用了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='数学系';