《oracle每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句
触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句
在触发器中不能运行 ddl语句和commit,rollback语句
ddl语句:DDL语句用语定义和管理数据库中的对象,如Create,Alter,Drop,truncate等;DDL操作是隐性提交的!
操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger
DML(Data Manipulation Language)数据操纵语言命令使用户能够查询数据库以及操作已有数据库中的数据。
如insert,delete,update,select等都是DML.
触发器是无需commit的,而且也不能写commit;触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,所以无需Commit;否则就会造成错误信息。当然,如果你一定要在触发器里写COMMIT,那也是可以的,可以用Oracle中的自治事务来处理,自治事务就相当于一个事务里的子事务。
在正常情况下,Oracle规定在触发器中不能运行 DDL(即Create/Alter/Drop)语句和Commit/Rollback语句的,因为DDL操作是隐性提交的,在触发器不允许有Commit,如在触发器中加入DDL语句,这种隐性提交就会导致错误信息;但有时特殊情况下需要在触发器中使用DDL语句,这时怎么办。
可以采取以下的解决办法:
1.在可以在触发器中加入:pragma autonomous_transaction;(在DECLARE后面) 表示是自由事务处理。
如:
CREATE OR REPLACE TRIGGER T_create BEFORE insert ON T_Tax_INS_BD
for each row
DECLARE
pragma autonomous_transaction;
NRDSId varchar(500):='';
begin
通过以上方法即可解决触发器中不能有DDL语句的问题!
一: 在触发器中使用DDL语句。 如 drop table t1 ,触发的时候会报错,
ORA-04092: cannot COMMIT in a trigger,因为DDL语句隐含commit。
二: 触发器的主体中使用了commit或rollback等DCL语句。ORA-04092:
cannot COMMIT in a trigger , 因为DML(delete/update/insert)触发器中
不能使用DDL(CREATE,DROP,ALTER)语句,也不能使用事务控制语句(DCL)
(ROLLBACK, COMMIT,SAVEPOINT)。特别注意的是,在触发器的主体中引用的
函数(function)/过程(procedure)中也不能有事物控制语句。
三: 注意: 系统级触发器(System Triggers)中可以使用DDL语句。
四: 处理方法: 去掉事务控制语句;如果procedure中必须有commit,那么可以
将commit 拿掉,由外部控制 。
相关文章
- 导出Oracle数据:简单快捷一键查询(oracle导出查询数据)
- 掌握Oracle中显示表命令的使用方法(oracle显示表命令)
- Oracle数据表分区技术:SQL语句实现(oracle表分区语句)
- Oracle 技巧:分割字段的方法(oracle分割字段)
- 灵活利用Oracle触发器实现数据库动态调整(oracle触发器类型)
- Oracle数据库中的相同概念——视图(oracle同义词视图)
- Oracle数据库中嵌套循环语句的使用方法(oracle嵌套循环语句)
- 如何优化Oracle系统的响应时间?(oracle响应时间)
- 不可缺少的【Oracle中约束不可或缺】(oracle中的约束是)
- Oracle表定义:最佳指南(oracle表定义)
- Oracle简单语句使用指南(oracle简单语句)
- 「如何调用函数Oracle?」——详解Oracle函数的调用方法(如何调用函数oracle)
- 利用Oracle中的循环语句实现数据处理(oracle中的循环语句)
- Oracle数据库:高效追踪SQL语句的工具分享(oracle跟踪sql工具)
- 用Oracle语句获取当前时间(oracle获取当前时间)
- Oracle 数据库如何处理死锁(oracle 关闭死锁)
- 使用Oracle中的关联修改语句提升数据处理效率(oracle关联修改语句)
- Oracle入门掌握基础的SQL命令(oracle入门命令)
- Java程序构建Oracle数据库直连(java直连oracle)
- Oracle代理实现SQL语句自动解析(oracle代理解析语句)
- Oracle中的列别名使用实例(oracle中的列别名)