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;


posted on   ~码铃薯~  阅读(203)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2020-01-10 oracle数据库-查询一张表中某个字段按照降序排列的前十条数据
2020-01-10 SQL语句-查询特定年份产生的数据
2020-01-10 SQL语句-查询一张表中某个字段存在相同值的数据

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示