示例18 行级、语句级和INSTEAD OF触发器
来源:互联网 发布:2016淘宝开店得多少钱 编辑:程序博客网 时间:2024/06/05 14:15
/*============================================================
示例 行级触发器
============================================================*/
CREATE OR REPLACE TRIGGER aiud_emp_row
AFTER INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
END IF;
END;
--删除emp表所有记录
delete from emp;
--回滚删除的数据
rollback;
--删除触发器
drop trigger aiud_emp_row
/*============================================================
示例 语句级触发器
============================================================*/
--语句级触发器
CREATE OR REPLACE TRIGGER aiud_emp
AFTER INSERT OR UPDATE OR DELETE
ON emp
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已更新');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('ORDER_MASTER 中的数据已删除');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('数据已插入 ORDER_MASTER');
END IF;
END;
--删除emp表所有记录
delete from emp;
--回滚删除的数据
rollback;
--删除触发器
drop trigger aiud_emp
/*============================================================
示例 INSTEAD OF触发器
============================================================*/
1.创建复杂视图
create or replace view dept_emp as
select a.deptno,a.dname,b.empno,b.ename
from dept a inner join emp b
on a.deptno=b.deptno;
2.通过视图插入纪录----失败。
insert into dept_emp values(50,'ADMIN','1223','MARY');
--失败原因,因为该视图涉及到2个表,emp是键保留表,dept是非键保留表。如果插入键保留表的数据,则不会报错,如果插入非键保留表的数据,则报错。
--什么是键保留表,是复杂视图(使用多个表创建的视图)中的其中一个表,该表的主键在视图中都是唯一且非空的,也是视图中的键,则该表是一个键保留表,如emp表。
--下面例子通过视图修改键保留表的列----成功
update dept_emp set ename='aaa' where empno=7788;
3.通过INSTEAD OF触发器添加-----成功
/*
通过对视图的插入语句触发INSTEAD OF触发器实现:
如果添加的部门不存在,则插入部门表
如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
*/
create or replace trigger tr_in_dept_emp
instead of insert on dept_emp
for each row
declare
v_temp int;
begin
--如果添加的部门不存在,则插入部门表
select count(*) into v_temp from dept
where deptno=:new.deptno;
if v_temp=0 then
insert into dept (deptno,dname)values
(:new.deptno,:new.dname);
end if;
--如果添加的雇员不存在,则插入雇员;如果存在,则报主键重复错误
select count(*) into v_temp from emp
where empno=:new.empno;
if v_temp=0 then
insert into emp
(empno,ename,deptno) values (:new.empno,:new.ename,:new.deptno);
else
raise_application_error(-20001,'主键重复');
end if;
end tr_in_dept_emp;
4.再执行插入记录-----成功
insert into dept_emp values(50,'ADMIN','1223','MARY');
5.查询插入后dept和emp表
select * from dept;
select * from emp;
0 0
- 示例18 行级、语句级和INSTEAD OF触发器
- instead of 和系统 触发器
- After和Instead of触发器
- 存储过程和触发器-INSTEAD OF触发器
- AFTER触发器和Instead Of触发器区别
- AFTER和INSTEAD OF触发器用途说明
- AFTER和INSTEAD OF触发器用途说明
- 触发器 INSTEAD OF 和 AFTER 的区别
- AFTER和INSTEAD OF触发器用途说明
- SQL触发器(AFTER和INSTEAD OF)
- 设计 INSTEAD OF 触发器
- instead of触发器
- INSTEAD OF 触发器
- 设计 INSTEAD OF 触发器
- instead of触发器
- INSTEAD OF 触发器
- 关于 INSTEAD OF 触发器
- 关于 INSTEAD OF 触发器
- android最常用的第四种点击事件
- 一个复杂一点的变化
- 示例17 创建触发器
- 第四课 如何开发一个万年历---下篇
- [LeetCode]Minimum Path Sum
- 示例18 行级、语句级和INSTEAD OF触发器
- quick-cocos2d-x物理引擎之chipmunk(一)
- USACO——Name That Number 命名那个数字
- OC笔记 - 事件处理(2015.4.3)
- quick-cocos2d-x物理引擎之chipmunk(二)
- 怎样下载美国气象数据用于hadoop实验
- linux中的w命令
- .net工程最后生成多少个dll
- java reference