关于错误:"ORA-04091: table is mutating, trigger/function may not see it"的分析(触发器操作自身表)

简介: 在写trigger的时候,经常会遇到这种情况当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误:  ORA-04091: table is mutating, tr...

在写trigger的时候,经常会遇到这种情况
当在程序块中需要对trigger本表进行修改或查询的时候,系统会提示错误:  ORA-04091: table is mutating, trigger/function may not see it

关于这个错误,其实是由于对本表的操作造成的.ORACLE DB里默认在写TRIGGER的时候把本表锁死,不允许对其进行操作,也就是说这个错误是不能通过系统的手段解决的,只能改用一些其它的SQL来绕开它.

对此可通过自治事物解决:

SQL> CREATE TABLE T(ID NUMBER(18),MC VARCHAR2(20),DT DATE);

表已创建。

SQL> CREATE OR REPLACE TRIGGER TR_T
  2  AFTER DELETE ON T
  3  FOR EACH ROW
  4  DECLARE V_COUNT NUMBER;
  5   --PRAGMA AUTONOMOUS_TRANSACTION;
  6  BEGIN
  7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
  8     COMMIT;
  9  END TR_DEL_CABLE;
10  /

触发器已创建

SQL> INSERT INTO T VALUES(1,'111111',SYSDATE);

已创建 1 行。

SQL> INSERT INTO T VALUES(2,'222222',SYSDATE);

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

        ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         1 111111               20080802 11:07:36
         2 222222               20080802 11:07:43

SQL> DELETE FROM T WHERE ID=1;
DELETE FROM T WHERE ID=1
            *
第 1 行出现错误:
ORA-04091: 表 TEST.T 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "TEST.TR_T", line 4
ORA-04088: 触发器 'TEST.TR_T' 执行过程中出错


SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

        ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         1 111111               20080802 11:07:36
         2 222222               20080802 11:07:43

SQL> CREATE OR REPLACE TRIGGER TR_T
  2  AFTER DELETE ON T
  3  FOR EACH ROW
  4  DECLARE V_COUNT NUMBER;
  5   PRAGMA AUTONOMOUS_TRANSACTION;--开启自治事物
  6  BEGIN
  7     INSERT INTO T VALUES(:OLD.ID,:OLD.MC,SYSDATE);
  8     COMMIT ;--提交自治事物
  9  END TR_DEL_CABLE;
10  /

触发器已创建

SQL> DELETE FROM T WHERE ID=1;

已删除 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT ID,MC,TO_CHAR(DT,'YYYYMMDD HH24:MI:SS') FROM T;

        ID MC                   TO_CHAR(DT,'YYYYM
---------- -------------------- -----------------
         2 222222               20080802 11:07:43
         1 111111               20080802 11:08:32
目录
相关文章
|
3月前
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
|
3月前
【Azure Function】Azure Function中的Timer Trigger无法自动触发问题
【Azure Function】Azure Function中的Timer Trigger无法自动触发问题
|
3月前
|
JSON 数据格式 Python
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Event所属于的PartitionID呢?
|
3月前
|
消息中间件 域名解析 网络协议
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
【Azure 应用服务】部署Kafka Trigger Function到Azure Function服务中,解决自定义域名解析难题
|
3月前
|
消息中间件 Kafka 网络安全
【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
|
3月前
【Azure 应用服务】调用Azure Function经常提示超时的分析
【Azure 应用服务】调用Azure Function经常提示超时的分析
|
3月前
|
C# 开发工具
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
【Azure 应用服务】Azure Function App使用SendGrid发送邮件遇见异常消息The operation was canceled,分析源码渐入最源端
|
4月前
|
SQL JavaScript 前端开发
函数计算操作报错合集之HTTP触发器报404错误,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
6月前
|
SQL HIVE
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
数仓面试重灾区之-Generic User-defined Table Generating Function(UDTF)
42 0
|
6月前
|
存储 Serverless 定位技术
深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析
深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析
147 0