`

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

阅读更多

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

解决办法是在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/

 

分享到:
评论

相关推荐

    oracle数据库开发工具

    在Oracle数据库的开发过程中,PL/SQL(Procedural Language/Structured Query Language)是一种不可或缺的语言,它将SQL的查询功能与过程式编程语言的特点结合在一起,为数据库应用程序提供了解决方案。 PL/SQL是...

    华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看.doc

    7. DELETE与TRUNCATE的区别:TRUNCATE操作速度快,不触发DELETE触发器,不能回滚,且不保留表的高水平线和索引。DELETE则支持回滚,可以触发触发器,适合少量删除。 8. 事务理解:事务从数据库连接或第一条SQL语句...

    华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看.pdf

    ROLLBACK可以回退事务,而SAVEPOINT则定义了事务中的可回退点。 11. 表结构变更:在不影响应用的情况下,添加列可使用`ALTER TABLE a ADD abc VARCHAR2(10)`,确保数据库处于静默状态。 12. 客户端连接服务器配置...

    华为面试题(附答案)Oracle.pdf

    未提交的事务可以回退,已提交的则不能。 11. **添加列**:添加列可以通过`ALTER TABLE table_name ADD column_name data_type;`命令完成,但在数据库繁忙时需确保数据一致性,可能需要先停止写入操作。 12. **...

    Oracle.11g.从入门到精通 (1/2)

    12.1.5 设置回退点 12.2 用锁控制并发存取 12.2.1 为何加锁 12.2.2 加锁的方法 第13章 Oracle数据库的安全管理 13.1 Oracle数据库安全性概述 13.1.1 Oracle 11g的安全性体系 13.1.2 Oracle 11g的安全性机制 13.2 ...

    Oracle.11g.从入门到精通 (2/2)

    12.1.5 设置回退点 12.2 用锁控制并发存取 12.2.1 为何加锁 12.2.2 加锁的方法 第13章 Oracle数据库的安全管理 13.1 Oracle数据库安全性概述 13.1.1 Oracle 11g的安全性体系 13.1.2 Oracle 11g的安全性机制 13.2 ...

    matlab开发-状态流中模拟函数的设计模式

    8. **错误处理和回退策略**:设计模式也涵盖了错误处理,确保状态机在遇到异常情况时能够适当地恢复或退出。 通过对这些文件的深入学习和实践,开发者能够掌握如何在StateFlow中有效地设计和实现模拟函数,从而在...

    Oracle 11g标准教程 思考与练习答案

    数据段(Segments)是在数据文件中分配的一组连续的空间,用于存储特定类型的数据,如数据段(Data Segment)、回退段(Rollback Segment)、临时段(Temporary Segment)。数据段由一系列的数据块组成,数据块...

    Oracle11g从入门到精通2

    12.1.5 设置回退点 12.2 用锁控制并发存取 12.2.1 为何加锁 12.2.2 加锁的方法 第13章 Oracle数据库的安全管理 13.1 Oracle数据库安全性概述 13.1.1 Oracle 11g的安全性体系 13.1.2 Oracle 11g的安全...

    华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看.docx

    - **回退机制**:通过ROLLBACK可以回退事务,保存点允许回退到特定位置。 10. **表结构修改**: - **添加列**:在数据库应用中,可以使用`ALTER TABLE table_name ADD column_name datatype`命令在线添加列。 11...

    华为面试题附答案OracleDBA数据库管理员JAVA程序员架构师必看.pdf,这是一份不错的文件

    - 通过ROLLBACK可回退未提交的事务,但已提交的事务无法回退。 12. **表结构修改**: - 在数据库运行时,为避免冲突,应先确保数据库处于静默状态,然后使用`ALTER TABLE a ADD abc`添加列。 这些面试题涵盖了...

    Oracle11g从入门到精通

    12.1.5 设置回退点 12.2 用锁控制并发存取 12.2.1 为何加锁 12.2.2 加锁的方法 第13章 Oracle数据库的安全管理 13.1 Oracle数据库安全性概述 13.1.1 Oracle 11g的安全性体系 13.1.2 Oracle 11g的安全性机制 ...

    2020年华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看.pdf,这是一份不错的文件

    ROLLBACK用于撤销未提交的事务,SAVEPOINT允许在事务中设定回退点。 12. 添加列:在数据库应用中,为表添加列需要确保数据库无写操作,然后使用`ALTER TABLE`语句,例如`ALTER TABLE A ADD ABC VARCHAR2(10)`。 13...

    华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看.doc.docx

    DDL语句会隐式提交事务,ROLLBACK可以回退未提交的事务,但不能回退已提交的事务。 11. **列添加**:向表A添加列abc,可以使用`ALTER TABLE a ADD abc VARCHAR2(10)`,但在生产环境中,可能需要确保数据库处于静默...

    精通Oracle.10g.PLSQL编程

    使用SQL语句 4.1 使用基本查询 4.1.1 简单查询语句 4.1.2 ...回退事务 4.3.4 只读事务 4.3.5 顺序事务 4.4 数据分组 4.4.1 分组函数 4.4.2 GROUPBY和HAVING 4.4.3 ROLLUP和...

    华为面试题(附答案)Oracle-DBA数据库管理员JAVA程序员架构师必看..pdf,这是一份不错的文件

    DDL语句会隐式提交事务,ROLLBACK可以回退未提交的事务,但无法回退已提交的事务。 10. 表结构修改:添加列可通过ALTER TABLE语句完成,如`ALTER TABLE A ADD ABC VARCHAR2(10)`,但需注意在高并发环境下可能需要先...

    oracle常用函数汇总.pdf

    - 性能优化:避免大范围操作,估算记录数并分批处理,以减小回退段压力。 在实际操作中,Oracle还提供了许多其他函数和特性,如聚合函数(SUM, AVG, COUNT等)、连接查询、子查询、游标、触发器等。了解并熟练掌握...

    精通oracle 10g plsql 编程-学习笔记

    - **回退事务**: 使用`ROLLBACK`语句撤销事务中的更改。 - **设置保存点**: 使用`SAVEPOINT`语句标记事务中的某一点,以便之后可以回滚到该点。 - **只读事务**: 在事务中只能读取数据,不能修改数据。 - **顺序事务...

    华为面试题附答案Oracle-DBA数据库管理员JAVA程序员架构师必看.pdf,这是一份不错的文件

    TRUNCATE速度快,不记录单独的删除操作,不触发触发器,不能回滚,适用于清空整个表。 9. **事务**:事务是数据库操作的基本单元,从第一条SQL语句开始,到COMMIT或ROLLBACK结束。COMMIT提交事务,使其永久化;...

Global site tag (gtag.js) - Google Analytics