oracle:触发器,自治事务 trigger
create or replace trigger TRI_FC83_INSERT
before insert ON FC83
FOR EACH ROW
declare
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
:new.afc212 := '';
delete from fc83
where afc001 = :new.afc001
and afa031 = :new.afa031
and afc210 = :new.afc210;
commit;
END TRI_FC83_INSERT;
oracle在trigger自制事务,目的很简单,就是在插入数据的时候,先插入一条afc212(原值为0)的值为1的数据,然后把afc212=0的数据删除。
如下:中红色是为了解决问题而新加入的(即解决事务无法提交)
触发TRI_FC83_INSERT的sql如下
insert into fc83 (afc001, afa031, afc163, afc187, afc183, afc157, afc181, afa040, afc180, afa192, afa051, afa053,
afc166, afc155, afc153, afc154, afa183, afa184, afa185, afa032, afa052, afa091, afc015, aaa010, afc210, afc211,
afa501, afa503, aaa102, afc212, afc501) select afc001, afa031, afc163, afc187, afc183, afc157, afc181, afa040, afc180, afa192, afa051, afa053,
afc166, afc155, afc153, afc154, afa183, afa184, afa185, afa032, afa052, afa091, afc015, aaa010, afc210, afc211,
afa501, afa503, aaa102, '', afc501 from fc83 where afc001='000000079X';
*-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-**-*-*-*-*
触发器的格式:
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE| AFTER} {UPDATE| INSERT| DELETE|SELECT} ON table_name
[FOR EACH ROW] [FOLLOWS another_trigger]
[ENABLE| DISABLE]
[WHEN condition]
DECLARE
xxxx;
BEGIN
NULL;
[EXCEPTION] END;
这是一般的触发器格式。
BEFORE|AFTER:选择触发器在 DML操作之前还是之后发生。
不知道触发器能不能够对 SELECT 起作用,应该可以的。
FOR EACH ROW:指定行触发器,只适用于UPDATE,INSERT,DELETE。
FOLLOWS,指定触发器的顺序,11g 以后使用的。
ENABLE|DISABLE:指定触发器启用还是禁用。(默认启动)
或者通过下列语句
ALTER TRIGGER trigger_name {ENABLE|DISABLE};
WHEN:指定执行触发器时必须要满足的条件。
一个表被删除,则定义在这表上的触发器也会被删除。
注意:
1.触发器也许不会执行事务控制语句,e.g.COMMIT、SAVEPOINT、ROLLBACK.当触发器执行是,所有执行的操作会称为事务的一部分。当事务被提交或滚回,触发器的才做也会提交或滚回。如果想跳出此规则可以通过 自治事务。
2.触发器调用任何的函数或者过程也许不会执行事务控制语句。除非包含 自治事务。
3.不允许在触发器中声明LONG 或者 LONG RAW 变量。
触发器中包含两个伪记录,分别为 :NEW 、 :OLD,使用时包括冒号,用于标识新的数据(INSERT时的)、旧的数据(delete时的)或者UPDATE则两者都有。逻辑上不存在时被设置为 NULL
这两者可以看做RECORD 使用。
触发器中提供布尔函数检查触发的是DML中何种状态,如下:
CREATE TRIGGER trigger_name
AFTER UPDATE OR DELETE ON table_name
DECLARE
v_type VARCHAR(20);
BEGIN
IF UPDATING THEN
v_type := 'updating' ;
ELSIF DELETING THEN
v_type := 'deleting';
END IF;
xxxxxxx;
END;
自治事务:
由其他事务(通常称为主事务)发起的独立事务。也就是说,自治事务也许会执行多个DML语句,并且提交或者滚回操作,而不会提交或者滚回主事务执行的DML语句。
例子:
有一个触发器,在table 执行UPDATE 之后被触发,以记录审计数据。假设你希望即使主事务失败,仍旧能够记录审计数据(即触发器操作仍然有效)。这样可以通过 自治事务实现。
语法:
CREATE OR REPLACE TRIGGER trigger_name
AFTER UPDATE ON table_name
DECLARE
xx;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
xx; COMMIT;
END;
PRAGMA AUTONOMOUS_TRANSACTION; 和 COMMMIT; 语句是必须的。
代替触发器(INSTEAD OF 触发器)
代替触发器定义于视图
CREATE OR REPLACE trigger_name
INSTEAD OF DELETE ON table_name
BEGIN
xxxx;
END;
假如在一个视图上进行删除操作,但是有完整性约束,可以通过INSTEAD OF 触发器删除约束表的数据。
oracle:触发器,自治事务 trigger的更多相关文章
- Oracle EBS 自治事务
自治事务程序主要是自主性,那就是,独立于主要的事务.之所以独立,或者提交之后会影响其他事务处理,本质在于它本身符合编译指令的规则,也就是说它属于在编译阶段就执行的指令,而不是在运行阶段执行的. 当自治 ...
- oracle函数自治事务解决不能增改删的语句操作
CREATE OR REPLACE FUNCTION SEQ3 (v_bname in VARCHAR2) return NUMBER is pragma autonomous_transaction ...
- Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题
// 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for ...
- ORACLE触发器的自治事务的注意事项
直接上代码: Create OR replace Trigger TR_ROBXMX_CLDJBHHX After INSERT OR UPDATE OR DELETE ON ROBXMX1 --要监 ...
- Oracle与SQL自治事务
自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...
- 关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍
AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...
- (转)关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍
AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事 ...
- [转]了解oracle自治事务
http://blog.csdn.net/indexman/article/details/7799862 1.什么是Oracle自治事务 在官方文档中,是这样的定义的“Autonomous tran ...
- ORACLE PRAGMA AUTONOMOUS_TRANSACTION 自治事务 单独提交某一段操作
个人使用示例: CREATE OR REPLACE PROCEDURE logs(p_remark VARCHAR2, p_log CLOB) AS PRAGMA AUTONOMOUS_TRANSAC ...
随机推荐
- ASP.NET运行机制原理
ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...
- VisualStudio 调试不提示调试错误
尝试办法: 1.工具->选项->调试->启用异常助手;2.调试->异常; 解决办法: 把2.调试->异常; 下地全部钩上异常就弹出来了
- ADO.NET基础(增删改查)
ADO.NET是一种数据访问技术,就是将C#和MSSQL连接起来的一个纽带.可以通过ADO.NET将内存中的临时数据写入到数据库中,也可以将数据库中的数据提取到内存中供程序调用. ADO.NET是所有 ...
- mysql 正则
mysql 正则学习 基本字符匹配 select desk from dealer_info where desk regexp "82107777"; . 表示匹配任意一个字符 ...
- linux命令(8)kill命令
kill命令: Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于 ...
- 图片--android 图片占用内存与什么有关
原文链接:http://blog.csdn.net/zjl5211314/article/details/7041813 在开发手机应用的时候,内存是有限的,那使用的时候,就要合理的运用和释放. 那么 ...
- JAVA实例,求用户输入的整数是否是偶数
题目:用户能输入一个整数,输入后返回是偶数还是奇数. 偶数规则:除以2能整除的数称之为偶数,否则是奇数 实例: switch版 import java.util.Scanner; public cla ...
- MySQL利用Navicat导出数据字典
这里算是一个小技巧 利用mysql的information_schema中的COLUMNS表 和navicat中的导出功能实现快速导出数据字典 CREATE TEMPORARYTABLE `COLUM ...
- Python应用01 原始Python服务器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人留言,表示只学Python没有用,必须学会一个框架( ...
- Eclipse Android HH and theme
一. 汉化方法: 1.Eclipse版本查询:安装目录readme,查版本号;参照查代号如下表: 代号 平台版本 项目 主要版本发行日期 SR1发行日期 SR2发行日期 N/A 3.0 [1] N/A ...