*触发器:*
*当用户执行了 insert|update|delete这些操作之后,可以发出一系列其他的动作。*
*作用:*
在动作执行之前或者之后,触发业务处理逻辑
插入数据,做一些校验
*语法:*
Create [or replace] triger 触发器名称 Before | after Insert |update|delete
On 表名
[for each row]
Declare
Begin
pl/sql 语句
End;
*案例 数据校验*
--星期六老板不在,不能办理新员工入职
插入数据之前
判断当前日期是否是周六
如果是周六,就不能插入新员工
create or replace trigger tri_datacheck
before insert on emp
declare
**--声明变量**
vday varchar2(10);
begin
**-- 查询当前系统日期**
select trim(to_char(sysdate, 'day')) into vday from dual;
**--判断当前日期**
if vday = '星期六' then
dbms_output.put_line('老板不在,不能办理入职');
**--自定义,抛出系统异常**
raise_application_error(-20001, '老板不在,不能办理入职');
end if;
end;
测试:
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
values (0000, 'ZYQ', 'CLERK', 7902, to_date('17-12-1980', 'dd-mm-yyyy'), 800.00, null, 20);
执行插入语句之后,我们会在output窗口中看到我们想要的输出结果。
如果如果我们在星期六办理入职的话,会提示
*触发器的分类:*
语句级触发器:不管影响多少行,都只会执行一次
行级触发器:影响多少行,就触发多少次
:old 代表旧的记录,更新前的记录
:new 代表的是新的记录
语句级触发器案例:
create or replace trigger tri_updatesal4
after
update
on person
--注意:语句级触发器就不要写for each row了
declare
begin
dbms_output.put_line('更新了所有员工的工资');
end;
执行该触发器:
begin
update person a set a.pname='李四' WHERE 1=1;
end;
DBMS OUT:
更新了所有员工的工资
行级触发器案例:
*小案例:给每位员工的工资加100块钱*
-- Created on 2020/12/17 by ZHAOYONGQIANG
--更新所有员工的工资 每****更新一位员工的工资就输出一句话
create or replace trigger tri_updatesal
after
update
on emp
for each row
declare
begin
dbms_output.put_line('更新了一位员工的工资');
end;
update emp a set a.sal=a.sal+100 WHERE 1=1;
输出结果:
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
更新了一位员工的工资
*--小案例 old 和 before*
*--判断员工涨工资后的工资一定要大于涨工资前的工资*
思路:触发器:before
旧的工资
新的工资
如果旧的工资大于新的工资,抛出异常,不让他执行成功
create or replace trigger tri_updatesalflag
before
update
on emp
for each row
declare
begin
if :old.sal>:new.sal then
raise_application_error(-20002,'旧的工资不能大于新的工资');
end if;
end;
--验证语句
update emp set sal=sal-10;
触发器实现类似MySQL主键自增:***
--触发器
create or replace trigger tri_add_person_pid
before
insert
on person
for each row
declare
begin
dbms_output.put_line(:new.pname);
**--给新纪录pid赋值**
select seq_person_pid.nextval into :new.pid from dual;
end;
--测试
insert into person values(null,'赵四');
SELECT * FROM person;