在trigger中如何操作变异表

CREATE OR REPLACE TRIGGER TR_E_FILE2 BEFORE INSERT OR UPDATE OR DELETE ON E_FILE2 FOR EACH ROW
DECLARE 
  seqno INTEGER;
  TYPE cursor_type IS REF CURSOR;
  cursor1 cursor_type;
  cursor2 cursor_type;
  efile_record e_file2%ROWTYPE;
BEGIN
  IF INSERTING THEN
    IF :NEW.ext='PDF' THEN
      SELECT LIBFILE2_SEQ.NEXTVAL INTO seqno FROM DUAL;
      INSERT INTO T_FILEINF2(SEQNO,"MODE",F_ID)VALUES(seqno,1, :NEW.DID);
      OPEN cursor1 FOR SELECT * FROM e_file2 WHERE ext='PDF' START WITH did=:NEW.did CONNECT BY PRIOR edid=did ORDER BY iscurr DESC;
      FETCH cursor1 INTO efile_record;
      FETCH cursor1 INTO efile_record;
      WHILE cursor1%FOUND LOOP
        DELETE FROM T_FILEINF2 WHERE f_id=efile_record.did;
        FETCH cursor1 INTO efile_record;
      END LOOP;
      CLOSE cursor1;
    ELSIF :NEW.ext='tif' THEN
      SELECT LIBFILE2_SEQ.NEXTVAL INTO seqno FROM DUAL;
      INSERT INTO T_FILEINF2(SEQNO,"MODE",F_ID)VALUES(seqno,1, :NEW.DID);
    END IF;
  ELSIF UPDATING THEN
    IF :NEW.ext='PDF' THEN
      OPEN cursor2 FOR SELECT * FROM e_file2 WHERE ext='PDF' START WITH did=:NEW.did CONNECT BY PRIOR did=edid ORDER BY iscurr DESC;
      FETCH cursor2 INTO efile_record;
      IF efile_record.iscurr=:NEW.iscurr THEN
        SELECT LIBFILE2_SEQ.NEXTVAL INTO seqno FROM DUAL;
        INSERT INTO T_FILEINF2(SEQNO,"MODE",F_ID) VALUES(seqno,2,:NEW.DID);
      END IF;
      CLOSE cursor2;
    ELSIF :NEW.ext='tif' THEN
      SELECT LIBFILE2_SEQ.NEXTVAL INTO seqno FROM DUAL;
    INSERT INTO T_FILEINF2(SEQNO,"MODE",F_ID) VALUES(seqno,2,:NEW.DID);
    END IF;
  ELSIF DELETING THEN
    SELECT LIBFILE2_SEQ.NEXTVAL INTO seqno FROM DUAL;
    INSERT INTO T_FILEINF2(SEQNO,"MODE",F_ID) VALUES (seqno,3,:OLD.DID);
   
  END IF;
END;

 

在执行下列语句时:

INSERT INTO e_file2(did,status,attr,attrex,ext) VALUES(333,0,0,0,'PDF');

UPDATE e_file2 SET title='aaabbbcccc' WHERE did=29;

都会出现异常:

ORA-04091: 表 JXSDAG.E_FILE2 发生了变化,触发器/函数不能读
ORA-06512: 在"JXSDAG.TR_E_FILE2", line 26
ORA-04088: 触发器 'JXSDAG.TR_E_FILE2' 执行过程中出错

 

因为在该触发器中使用到了触发表,而触发表现在处于变异状态,所以从中读取数据时将提示上述信息。

解决方案:在declare后加入自治事务语句PRAGMA   AUTONOMOUS_TRANSACTION;

再执行上述两个语句,又产生了异常

 

ORA-06519: 检测到活动的自治事务处理,已经回退
ORA-06512: 在"JXSDAG.TR_E_FILE2", line 40
ORA-04088: 触发器 'JXSDAG.TR_E_FILE2' 执行过程中出错

 

是因为没有对自治事务进行事务处理,在end之前加入commit,问题解决!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值