《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每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句的更多相关文章
- Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)
触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...
- Oracle Day09 存储与触发器
1.存储 存储过程.存储函数:指存储在数据库中供所有用户程序调用的子程序. --创建存储过程(procedure) --用create procedure 命令建立存储过程. 格式: create o ...
- .Net程序员学用Oracle系列(8):触发器、作业、序列、连接
1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2.使用序列 & 删除序列 4.连接 4.1.创建连接 4.2.使 ...
- 【Oracle】详解ORACLE中的trigger(触发器)
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- ORACLE PL/SQL:触发器
ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...
- Oracle学习笔记十三 触发器
简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用. 触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和 ...
- oracle创建函数和调用存储过程和调用函数的例子(区别)
创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...
- Oracle触发器之替代触发器
替代触发器 替代视图增删改操作.视图可以认为成逻辑上的一张表,类似于把一个sql语句的执行结果永久的像表存储到数据 库中,视图一般用来做查询. 创建视图的语法: create view 视图名称 as ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
随机推荐
- Create new tool for CSV
CsvFileStream.cs public class CsvFileStream { TextReader stream; bool EOS = false; bool EOL = false; ...
- Spring中ApplicationContext对事件的支持
Spring中ApplicationContext对事件的支持 ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...
- WEBSTORM 打开多个项目的方法
WebStorm默认情况下一次只能打开一个项目,这点很不爽,其实是可以设置的. 方法: File -> settings -> Directories -> Add Content ...
- servlet生命周期与工作原理
→ Jsp的本质是Servlet,Servlet是服务器端的小程序,运行在服务器,用于处理及响应客户端的请求. Servlet和JSP的区别: servlet是特殊的Java类,必须继承HttpS ...
- WindowsService 创建.安装.部署
windows服务的用法很适合用于一些长期跑的项目..不需要人工操作..不需要服务器一直登陆..很方便.. 不说废话..直接开整.. 启动VS2012..创建Windows服务项目.. 确定..创建成 ...
- Cornerstone详细操作
1.⾸首先打开Cornerstone 2.然后如下图所⽰示: 3.选择对应的仓库,如下图所⽰示 4.然后Import完成之后,就把本地的⽂文件提交到SVN服务器上了,如下图所⽰示,另外如果你想要使 ...
- flask 项目的开发经验总结
已经开发了几个flask项目, 是时候总结一下了, 这里涉及到项目源码的组织, 常用的包, 源码示例. =========================需要的 python 包有:========= ...
- ASP.NET 大文件下载的实现思路及代码
文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ...
- 常见的几个angular.js的问题
来源于网络收集 一.ng-show/ng-hide 与 ng-if的区别? 我们都知道ng-show/ng-hide实际上是通过display来进行隐藏和显示的.而ng-if实际上控制dom节点的增删 ...
- Web前端开发规范文档(google规范)
(Xee:其实没什么规范约束,但是养成一种好习惯,何乐而不为?) 区分大小写 xhtml 区分大小写,xhtml要求 标签名 属性名 值都要小写,并且要有双引号和 标签闭合. css 元素名称以及i ...