Oracle(触发器&内置程序包)
1、触发器关键词:
trigger
2、概述:是一个特殊的储存过程(看做一个容器中可以限制一些操作)
3.作用:当执行DML(insert,update,delete)语句时,触发器会被自动触发,不能手动调用 4.触发器的使用场景: #(1)可以限制数据的插入 #(2)可以限制数据的修改 #(3)可以限制数据的删除 #(4)重点:a.级联删除(同时删除主表和丛表) b.序列+触发器===》模拟自增长
语法(2322):
2: after before 2个触发器时间点
3: insert | update | delete 3个触发事件
2: 2个触发模式 语句级触发器模式 行级触发器模式
2: 2个伪表 :new : old
# 触发器使用语法(2322):
create or replace trigger 触发器名字
after | before
insert or update or delete on tableName
for each row
begin
(可执行模式,限制数据新增、修改、删除)
end;
===================================================================
例一:
--需求:创建一个触发器,限制学生:康康禁止插入 create or replace trigger t_demo1 after insert on stuInfo for each row begin --限制康康不能插入 if (:new.stuName = 康康) then --错误窗口提示,阻止DML语句运行成功。raise_application_error(状态码,错误信息); 状态码范围: -20000 -20099 raise_application_error(-20001,康康不能插入,有污点); end if; end;
例二:
create or replace trigger t_demo3
after
insert or update or delete on stuInfo
for each row
begin
if inserting then
if(:new.stuName=廖俊杰) then
raise_application_error(-20004,廖俊杰不能新增);
elsif updating then
if(:old.stuName=康康2) then
raise_application_error(-20005,康康2不能删除);
elsif deleting then
if(:old.stuName=梅超风) then
raise_application_error(-20006,梅超风不能修改);
end;
=========================================================================
例一:
--实现功能:利用触发器实现删除主表的数据时,同时将从表的数据删除掉
select * from stuInfo;(主表) select * from stuMarks;(丛表)
create or replace trigger t_demo4 after delete on Stuinfo for each row begin --当触发器被触发时,立刻获取触发器所在表的id 作为条件删除从表的数据 delete from stuMarks where stuMarks.Stuno = :old.stuno; end;
例二: --序列+触发器 模拟标识列
create or replace trigger t_emp
before
insert on new_emp
for each row
begin
--当触发器被触发时。获取到当前序列的下一个值,立即赋值给new_emp新表中的id属性
select s_emp.nextval into :new.empno from dual;
end;