如何在Oracle触发器中使用查询语句
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何在Oracle触发器中使⽤查询语句
通常情况下,Oracle数据库禁⽌在⾏级触发器或⾏级触发器所调⽤的⼦程序中使⽤查询语句。
但是,⾯对复杂的业务逻辑,不可避免的要使⽤查询语句。
当在⾏级触发器中使⽤查询语句时,Oracle数据库会抛出ORA-04091异常。
Oracle官⽅⽂档中对ORA-04091异常的说明如下:
ORA-04091: table string.string is mutating, trigger/function may not see it
Cause: A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
如果必须要在Trigger中使⽤查询语句,Oracle也提供了⼀种途径。
下⾯以简单的代码为例做说明:
1CREATE OR REPLACE TRIGGER TRG_TEST
2 BEFORE INSERT OR UPDATE OR DELETE ON SCOTT.EMP
3FOR EACH ROW -- ⾏级触发器
4DECLARE
5 PRAGMA AUTONOMOUS_TRANSACTION; -- 解决⾏级触发器不能使⽤查询语句的关键
6
7 V_COUNT PLS_INTEGER;
8BEGIN
9SELECT COUNT(*) INTO V_COUNT FROM SCOTT.EMP;
10IF V_COUNT >0THEN
11-- DO SOMETHING
12NULL;
13END IF;
14
15COMMIT; -- 提交
16 EXCEPTION
17WHEN OTHERS THEN
18ROLLBACK; -- 回滚
19END TRG_TEST;
如上⾯代码所⽰:在定义Trigger时,声明其事务的提交模式为PRAGMA AUTONOMOUS_TRANSACTION。
但是,⽤户必须⾃⼰提交或回滚事务。
对于PRAGMA AUTONOMOUS_TRANSACTION的说明请参考。