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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· 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语句-查询一张表中某个字段存在相同值的数据