发生了变化 触发器函数不能读它_oracle 发生了变化, 触发器/函数不能读它 | 学步园...

本文通过示例介绍了在Oracle中遇到的并发问题,当尝试在触发器中修改刚刚被删除的记录时,会遇到'表发生变化,触发器/函数不能读它'的错误。通过添加PRAGMA AUTONOMOUS_TRANSACTION解决这个问题,允许触发器在独立的事务中执行,避免了并发冲突。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值