(本文章内容仅在windows10下经测试能够运行,不能保证其他环境下的可靠性)
目录
触发器的概念
定义一个规则,在增删改操作时,只有满足规则,自动触发,无需调用。
触发器的分类
1)语句级触发器:不包含for each row
2)行级触发器:包含for each row
使用for each row主要是为了使用:old和:new伪对象
PL/SQL触发器语句即:old、:new伪对象的值
详情参照下表:
语句 | :old | :new |
insert | 空值 | 插入的数据 |
update | 修改前的数据 | 修改后的数据 |
delete | 删除前的数据 | 空值 |
语句级触发器的创建和使用
语法:
create [or replace] trigger 触发器名
after/before
insert/update/delete on 表名
declare
定义变量
begin
触发器语句
end 触发器名;
使用语句级触发器实现:在person表插入一条记录后输出"一个新员工入职"
示例代码如下:
create or replace trigger t1 after insert on person declare begin dbms_output.put_line('一个新员工入职'); end t1;
注意,在触发器语句的定义时,存在中文,可能会导致触发器创建后,伴随红叉,如不能解决中文问题,建议不使用中文。
行级触发器的创建和使用
语法:
create [or replace] trigger 触发器名
before/after
insert/update/delete
on 表名
for each row
declare
声明变量
begin
触发器语句(可以使用:old和:new)
end 触发器名;
使用行级触发器实现:在修改emp员工信息时,薪水下降时报错
示例代码如下:
create or replace trigger t2 before update on emp for each row declare begin if :old.sal > :new.sal then raise_application_error(-20001,'不能降薪'); end if; end t2;
注意:raise_application_error(number,varchar2);函数的第一个参数的范围为-20001~-20999