ORACLE 触发器 INSRETING,UPDATING,DELETING 函数
2014-04-23 09:38
393 查看
当对表行DML操作时,如果有多种操作 即INSERT,UPDATE,DELETE同时存在时,怎么判断对表进行的操作是哪一种呢?
ORACLE提供了三个内置
函数INSRETING,UPDATING,DELETING.
如下:
CREATE TABLE temp(id number(3),name varchar2(10));
insert into temp values (1,'a');
CREATE TRIGGER temp_audis AFTER UPDATE OR DELETE OR INSERT ON temp
FOR EACH ROW
BEGIN
IF updating THEN
dbms_output.put_line('the opreation is update on temp');
ELSIF inserting THEN
dbms_output.put_line('the opreation is inserting a row to temp');
ELSE
dbms_output.put_line('the opreation is delete a row from temp');
END IF;
END ;
替代触发器
考虑以下情况: 有两张表A,B当向表A中插入一条数据时,同时向B中也插入一条相同的数据,以保持同步. 同理向B中插入一条记录时也向A插
入一条同样的记录,以保持数据同步.如果向往常一样建触发器,会造成循环.但要想实现这样的功能,怎么办呢? ORACLE提供了替代触发
器(INSTEAD OF) ,替代触发器是专对于视图的. 考虑刚才的情况,对表改名,建立同名视图A,B,然后在视图上建立替代触发器,触发器主代
码对表进行操作,这样就避免了循环,实现所述功能.
CREATE TABLE A (ID NUMBER(2)) ;
CREATE TABLE B (ID NUMBER(2)) ;
ALTER TABLE A RENAME TO A_V ;
ALTER TABLE B RENAME TO B_V ;
CREATE VIEW A AS SELECT * FROM A_V ;
CREATE VIEW B AS SELECT *FROM B_V ;
CREATE TRIGGER A_BIS INSTEAD OF INSERT ON A FOR EACH ROW
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
CREATE TRIGGER B_BIS INSTEAD OF INSERT ON B FOR EACH ROW
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
当执行INSERT INTO A VALUES(2); ORACLE并不向A中插入一行,它只是执行触发器的代码,至于触发语句本身,则被跳过了,这就是所谓的"替代"吧.
ORACLE提供了三个内置
函数INSRETING,UPDATING,DELETING.
如下:
CREATE TABLE temp(id number(3),name varchar2(10));
insert into temp values (1,'a');
CREATE TRIGGER temp_audis AFTER UPDATE OR DELETE OR INSERT ON temp
FOR EACH ROW
BEGIN
IF updating THEN
dbms_output.put_line('the opreation is update on temp');
ELSIF inserting THEN
dbms_output.put_line('the opreation is inserting a row to temp');
ELSE
dbms_output.put_line('the opreation is delete a row from temp');
END IF;
END ;
替代触发器
考虑以下情况: 有两张表A,B当向表A中插入一条数据时,同时向B中也插入一条相同的数据,以保持同步. 同理向B中插入一条记录时也向A插
入一条同样的记录,以保持数据同步.如果向往常一样建触发器,会造成循环.但要想实现这样的功能,怎么办呢? ORACLE提供了替代触发
器(INSTEAD OF) ,替代触发器是专对于视图的. 考虑刚才的情况,对表改名,建立同名视图A,B,然后在视图上建立替代触发器,触发器主代
码对表进行操作,这样就避免了循环,实现所述功能.
CREATE TABLE A (ID NUMBER(2)) ;
CREATE TABLE B (ID NUMBER(2)) ;
ALTER TABLE A RENAME TO A_V ;
ALTER TABLE B RENAME TO B_V ;
CREATE VIEW A AS SELECT * FROM A_V ;
CREATE VIEW B AS SELECT *FROM B_V ;
CREATE TRIGGER A_BIS INSTEAD OF INSERT ON A FOR EACH ROW
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
CREATE TRIGGER B_BIS INSTEAD OF INSERT ON B FOR EACH ROW
BEGIN
INSERT INTO B_V VALUES(:NEW.ID);
INSERT INTO A_V VALUES(:NEW.ID);
END ;
当执行INSERT INTO A VALUES(2); ORACLE并不向A中插入一行,它只是执行触发器的代码,至于触发语句本身,则被跳过了,这就是所谓的"替代"吧.
相关文章推荐
- Oracle学习之常用对象(二)—触发器&游标&函数
- Oracle 过程(Procedure)、函数(Function)、包(Package)、触发器(Trigger)
- [Oracle]函数,过程,触发器的误删除的恢复
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle中重新编译无效的存储过程, 或函数、触发器等对象
- 东软学习,oracle函数与触发器
- Oracle基础学习之函数,触发器等
- Oracle笔记 十一、PL/SQL函数和触发器
- oracle(3)pl/sql编程基础 存储过程、函数、包、触发器
- Oracle pl/sql分类 -- 过程,函数,包,触发器
- oracle删除当前用户中所有对象(表,视图,触发器,存储过程,函数)
- Oracle笔记 十一、PL/SQL函数和触发器
- Oracle查看表、存储过程、触发器、函数等对象定义语句的方法
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle: 删除当前用户的所有对象(表、视图、触发器、存储过程、函数)
- Oracle笔记 十一、PL/SQL函数和触发器
- oracle 索引,视图,存储过程,触发器 函数
- Oracle 查看 表 存储过程 触发器 函数 等对象定义语句的方法
- Oracle笔记 十一、PL/SQL函数和触发器