oracle触发器

*触发器:*

*当用户执行了 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;


原文地址:https://www.cnblogs.com/dongyaotou/p/14259459.html