解决触发器检测到活动的独立的事务处理, 已经回退、表发生了变化, 触发器/函数不能读它

   今天在写一个触发器的时候遇到一个问题,因为要用到新插入表中的数据进行查询,所以就遇到了一个问题:

解决办法是在DECLARE中加上一句话:PRAGMA AUTONOMOUS_TRANSACTION

但是这样又会遇到一个问题:

解决办法是在DML语句后面加上COMMIT

附上语句如下:

CREATE OR REPLACE TRIGGER "TR_CMS_MEMBERINFO"
AFTER INSERT OR UPDATE ON MEMBERNAME
FOR EACH ROW
  DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
  ROWCOUNT INTEGER;
  CLTPARENTNO VARCHAR2(30);
  BEGIN
    SELECT COUNT(*) INTO ROWCOUNT FROM MEMBERNAME WHERE CLTNO = :NEW.CLTNO;
    IF ROWCOUNT > 0 THEN
      BEGIN
        BEGIN
          SELECT CLTNO INTO CLTPARENTNO FROM MEMBERNAME WHERE ID = :NEW.PARENT_ID;
          EXCEPTION WHEN NO_DATA_FOUND THEN
            CLTPARENTNO := NULL;
        END;
        UPDATE ZKNMEMBER SET PARENTNO = CLTPARENTNO,LASTUPDATETIME = SYSDATE WHERE CLTNO = :NEW.CLTNO;
       COMMIT;
      END;
    ELSE
      BEGIN
        BEGIN
          SELECT CLTNO INTO CLTPARENTNO FROM MEMBERNAME WHERE ID = :NEW.PARENT_ID;
          EXCEPTION WHEN NO_DATA_FOUND THEN
            CLTPARENTNO := NULL;
        END;
        INSERT INTO ZKNMEMBER (CLTNO,PARENTNO,FEEMETHOD,FEEDIR1,FEEDIR2,CREATETIME,LASTUPDATETIME) VALUES (:NEW.CLTNO,CLTPARENTNO,1,1,1,SYSDATE,SYSDATE);
       COMMIT;
      END;
      END IF;
    END;

另外附上一篇关于触发器详解的博文:http://blog.csdn.net/indexman/article/details/8023740/

 

时间: 2024-09-20 20:48:16

解决触发器检测到活动的独立的事务处理, 已经回退、表发生了变化, 触发器/函数不能读它的相关文章

关联到两张表,如何写触发器

问题描述 关联到两张表,如何写触发器 要求:数据在insert 到表A前(一笔一笔Insert),如果表A的字段1的值存在于表B中的字段2中,则报错,数据无法insert到表A中.这个触发器要怎么写呢.高人指点下.. 解决方案 已经找到方法了.如下,其中定义的变量为m一开始定义成connt还不行... create or replace trigger INSERT_AA before insert on aa For Each Rowdeclare -- local variables her

管理-在选课信息表中建立选课触发器 简单些 用if else 明天就要交了急急急!!!

问题描述 在选课信息表中建立选课触发器 简单些 用if else 明天就要交了急急急!!! 建立学生信息表 create table student ( Stu_No BIGINT(80) PRIMARY KEY, Stu_Name VARCHAR(25) NOT NULL, Stu_Sex VARCHAR(2) NOT NULL, College VARCHAR(40) NOT NULL, Profession VARCHAR(40) NOT NULL, Class INT(10) NOT N

数据库-如何实现一个触发器:在插入一条数据前创建一个表,表名由插入的数据决定?

问题描述 如何实现一个触发器:在插入一条数据前创建一个表,表名由插入的数据决定? MySQL数据库的触发器能不能实现创建表,表名用变量指定? 这个变量该如何表示? 谢谢. 解决方案 可以的,使用动态sql就可以,参考如下链接 http://www.2cto.com/database/201209/156678.html

A表插入数据 mysql 触发器

问题描述 A表插入数据 mysql 触发器 三个表 A 表 温度 压力 B表 温度最小 温度最大 压力最小压力最大 C表 (id 报警类型 ) 当向 A表插入数据后 如果 A表中的温度 低于B表中的最小温度或高于再大温度 A表中的压力 低于B表中的最小压力或高于再大压力 则向C表中添加记录 1 值为温度 2 值为压力 如果在范围内 则不需要向c表添加记录 解决方案 create trigger tg4 after insert on A 表 for each row begin //放你的逻辑

ORA-04091 触发器/函数不能读

  报错如下: SQL> update GPPAYMENTFUND set attribute5='1' where fundapplyno ='20120314500102010001'; update GPPAYMENTFUND set attribute5='1' where fundapplyno ='20120314500102010001' ORA-04091: 表 ACDEP.GPPAYMENTFUND 发生了变化,触发器/函数不能读ORA-06512: 在"ACDEP.CL

解决WIN8 磁盘100 活动占用100% win8硬盘一直响

  一.先看最终效果: 二.再说解决办法:   1.任务管理器关闭进程 taskhost.exe和类似于taskhostxx.exe开头的进程. 2.在电源管理里面设置2分钟不使用硬盘则关闭硬盘,看我的截图. 3.在控制面板找到[管理工具]--[计算机管理]--[任务计划程序]里面禁用2个任务触发器,这个任务是扫描硬盘的,非常占用硬盘也没啥用!关闭方法看我的截图.     三.以下是经过:   话说我在2014年2月底的时候买了联想v4400,买回来是win8的系统,开机啊什么的都很ok,一点声

解决360检测出文件目录列表显示漏洞的方法_服务器其它

昨天用360安全检测扫了本站,出现文件目录列表显示漏洞提示和同主机网站安全存在旁注风险警告,本次检测301个网页,耗时3时15分29秒,这个时间也忒长了,我记得扫描的时候,显示扫描结果30分钟后可以看到,唉,这差距也忒远了! 今天就文件目录列表显示漏洞这个问题,找到了解决方法,现在把方法提供出来,希望能帮忙其他有同样问题的朋友! 方法一: 修改.htaccess文件 在空间网站的根目录下找到.htaccess文件,添加这句代码到.htaccess文件的最后,独立占一行. Options All

如何解决笔记本电脑检测不到无线网络

  1.首先鼠标点击开始菜单中的控制面板,然后在控制面板中,选择点击"软件和声音"; 2.在打开的软件和声音界面中,点击进入右侧的"windows移动中心"; 3.然后在windows移动中心中,可以看到无线网络开关被关闭,只要点击下方"开启无线网络"按钮,然后再进行检测无线就会发现可以了哦.

几步解决WinPE检测不到移动硬盘问题

  方法一:在WinPE系统的桌面上,鼠标右击"我的电脑"->"管理"->"磁盘管理",可以看到WinPE系统已经认出了移动硬盘(磁盘1),只是没有给它分配盘符而已.在移动硬盘(磁盘1)的某个分区上(若有2个及其以上分区)鼠标右击"更改驱动器名和路径"->"添加"->"确定",给它分配一个盘符.这样怎么在"我的电脑"或"资源管理器&q