《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 拿掉,由外部控制 。
时间: 2024-11-06 09:42:57

《oracle每天一练》触发器不能调用或间接调用COMMIT,ROLLBACK等DCL语句的相关文章

直接调用、间接调用和内联调用

一般情况下,当C或者C++编译器遇到一个非内联函数的定义时,它会为该函数的定义生成机器码,并把这些机器码存储在一个目标文件中.同时,它还创建了一个与这些机器码相关联的名称.在C中,这个名称通常就是函数本身的名称:而在C++中,该名称还要加上参数类型的编码,从而即使在出现函数重载的情况下,也能够获得唯一的名称(最后这个名称通常称为mangled name,有时也称为decorated name).譬如,当编译器看到一个如下的调用: f() 它将会生成函数f的机器码.对于大多数机器语言来说,调用指令

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

Oracle学习笔记十三 触发器

简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用. 触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和日志记录 4.启用复杂的业务逻辑 创建触发器的语法 CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON

oracle 学习笔记之触发器

说明 数据库触发器是一个与表相关联的.存储的PL/SQL程序.每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列. 触发器的类型 语句级触发器:在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行 . 行级触发器(FOR EACH ROW):触发语句作用的每一条记录都被触发.在行级触发器中使用old和new伪记录变量, 识别值的状态. 触发器可用于:1)数据确认  2)实施复杂的安全性检查.3)做审计

oracle创建函数和调用存储过程和调用函数的例子(区别)

创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; --创建函数 create or replace function func (dno number) return number is t_max number; begin select max(sal) into t_max from emp t where deptno = dno; ret

C#使用CLR/C++的DLL间接调用Native C++的DLL

C#使用CLR/C++的DLL间接调用Native C++的DLL 开发环境:win 7  VS2010 简介:C#的exe使用CLR/C++间接调用Native C++的DLL. 第一步:创建一个C#的Console Application工程-->命名“ConsoleApplication1”. 第二步:创建一个CLR/C++的工程,右击“ConsoleApplication1”上面的“Solution 'ConsoleApplication1'”-->Add-->NewProjec

RHEL6-X Window System-8.图形桌面的本地调用与远程调用解析

Linux的X或X11 (X Window System)是一个基础的图形框架接口,拥有基本的图形显示.在此框架基础之上,有诸如GNOME/KDE之类的图形桌面窗口管理应用软件(Window manager).而且图形框架X11包括两大部分X Client与X Server,采用C/S主从架构.所以它是一个system而不单单只是一个组件. Linux图形桌面的本地调用与远程调用解析如图 说明: 通过图形还是文本控制台传递命令,经过内核处理后,返回相应的数据给对方 本地情况: 1.如果是图形,则

同步调用和异步调用同时存在导致的混乱

其实在Promise之外也存在这个问题,这里我们以一般的使用情况来考虑此问题.这个问题的本质是接收回调函数的函数,会根据具体的执行情况,可以选择是以同步还是异步的方式对回调函数进行调用.下面我们以 onReady(fn) 为例进行说明,这个函数会接收一个回调函数进行处理. mixed-onready.js function onReady(fn) { var readyState = document.readyState; if (readyState == 'interactive' ||

在UIWebView中间接调用网页中的javascript代码获得想要的值

日记和一些废话: 今天在使用webView加载网页后, 发现网页中的点击事件是用js代码实现的, 可是怎么点击都没有反应, 而且我主要是想获取到点击事件转到的url , 后来发现html中又这么一段代码: document.addEventListener('WebViewJavascriptBridgeReady', function onBridgeReady(event) function openPage(pageUrl) { if(bridge) { bridge.send(pageU