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 ...
随机推荐
- Java-螺旋方阵
用Java实现螺旋方阵 螺旋方阵:是指呈螺旋状的矩阵. 具体实现如下: public void screwMatrix() { System.out.print("请输入数字:") ...
- 黄聪:使用WORDPRESS自带AJAX方法
例如给网站每页logo后面的一句名言,点击“换一条”就会ajax动态加载一条,使用了wordpress的自带ajax方法.下面介绍如何使用wordpress自带ajax方法: 1.在header.ph ...
- The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved
偶在页面里引入了标签如下: <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core&q ...
- php之面向对象
<?php declare(encoding='UTF-8'); class Site{ /*成员变量*/ var $url; var $title = "gunduzi" ...
- php pcntl 多进程学习
1.捕获子进程退出(监听SIGCHLD信号,然后调用 pcntl_wait 函数) declare(ticks=1); pcntl_signal(SIGCHLD, "sig_handler& ...
- Windows下编译使用Aliyun OSS PHP SDK
摘要: WIN环境下搭建Aliyun OSS PHP SDK编译运行环境.从PHP的安装逐步完成,SDK的编译运行.即使没有任何PHP基础,也能顺利完成. 安装环境:Win7 64 + PHP 5.6 ...
- MongoDB基本命令的使用
成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作. 输入help可以看到基本操作命令: show dbs:显示数据库列表 show collections:显示 ...
- R中根据匹配原则将一列拆分为几列的方法
例如我们需要将一下数据的第二列从and处拆分为两列: before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar ...
- ThinkPHP CURD返回结果参考
ThinkPHP CURD返回结果参考: 1)查询$table->find() ##返回一条记录,是一个关联数组,是一维数组.$table->select() ##返回第一维是索引数组,第 ...
- PXE批量部署linux操作系统
前言 在实际生产环境中,有时候我们会碰到为几十上百甚至上千台服务器安装Linux操作系统的需求,如果我们还是常规的去使用移动介质逐台安装,显然是一件低效又令人抓狂的事情,那要安装到何年何月啊?这对于我 ...