oracle:触发器,自治事务 trigger

create or replace trigger TRI_FC83_INSERT
  before insert ON FC83
  FOR EACH ROW
declare
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  :new.afc212 := ‘1‘;
  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, ‘1‘, 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 触发器删除约束表的数据。

时间: 2024-11-04 12:09:59

oracle:触发器,自治事务 trigger的相关文章

oracle 触发器与事务

(1)如果外部事务撤销,触发器形成的变更是否会撤销?如果触发器操作失败,是否会导致外部SQL失败,从而导致事务撤销(2) 事务回滚时,触发器形成的变更是否会撤销:(3) 触发器失败时,外部SQL是否会返回错误:如果会,则研究如何不返回错,如果不会,则研究如何会返回错误:(4) 触发器失败时(插入两条记录,前者成功,后者失败),事务回滚时触发器形成的变更是否会撤销:(5) 触发器失败时(插入两条记录,前者成功,后者失败),事务提交时触发器形成的变更是否会撤销: 答 在oracle中,对触发器的限制

Oracle的自治事务

自治事务(autonomous transaction)允许你创建一个"事务中的事务",它能独立于其父事务提交或回滚.利用自治事务,可以挂起当前执行的事务,开始一个新事务,完成一些工作,然后提交或回滚,所有这些都不影响当前所执行事务的状态.自治事务提供了一种用PL/SQL控制事务的新方法,可用于: 顶层匿名块: 本地(过程中的过程).独立或打包的函数和过程: 对象类型的方法: 数据库触发器. 使用例子演示自治事务如何工作 --创建测试表用于保存信息 [email protected]&

Oracle 通过触发器 来创建 同步临时表 及处理 通过 自治事务 来解决 查询 基表的问题

// 触发器 create or replace trigger tr_sync_BD_MARBASCLASS after INSERT or UPDATE on BD_MARBASCLASS for each row declare v_cnt integer; PRAGMA AUTONOMOUS_TRANSACTION; -- 自治事务 begin /** * Name : tr_sync_BD_MARBASCLASS * Desc : 物料分类 增量同步 触发器 * Author : wu

Oracle与SQL自治事务

自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的事务的影响. 如果session从B事务开始——A事务开始和结束——B事务结束 上述的A事务不受没有完成的B事务的影响,然后A事务执行完毕后再次回到B事务执行没有完成的B事务. 通过pragma autonomous_transaction将一个pl/sql程序结构设定为自治事务,pragma是编译

[转]Oracle触发器(TRIGGER)总结

摘自:http://wang286480403.iteye.com/blog/1882495 1.触发器定义:触发器是数据库中由一个时间触发的特殊的存储过程,他不是由程序调用也不是手工启动的.触发器的执行可以由对一个表的insert,delete, update等操作来触发,触发器经常用于加强数据的完整性约束和业务规则等等. 2.触发器作用:触发器可以对其他表进行查询,也可以包含复杂的SQL语句.他么主要用于强制服从复杂的业务规则或者要求.例如可以利用触发器根据客户当前的帐户状态来控制是否允许插

关于Oracle AUTONOMOUS TRANSACTION(自治事务)的介绍

AUTONOMOUS TRANSACTION(自治事务)的介绍 在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦! 有没有一个简单的方法解决类似问题呢

Oracle - 自治事务autonomous transaction

自治事务 - autonomous transaction 在Oracle数据库中,有时候我们会希望记录一个过程或者函数的运行日志,不管正常运行结束还是触发异常结束,都要记录. 正常结束的没有问题,但是触发异常的情况下,一般的过程或者函数显然不能在插入运行日志之后直接Commit,因为触发异常后相关业务逻辑需要RollBack. 而自治事务就能够很好的避免了这样的问题,就是说自治事务是在某个会话中独立开启一个事务,在其中处理的操作不会影响到同一会话中其他事务未提交的内容. 下面开始举个例子说明一

Oracle自治事务实际用例

如下,新建两个存储过程: 在主自治事务中,我们插入一条记录,然后在自治事务中,查看表中行数,然后尝试插入三条记录,查看行数,最后rollback 查看行数,最后返回主事务,查看行数. 1.如下代码: --主事务 PROCEDURE p_test_at_and_mt IS cnt NUMBER := -1; BEGIN INSERT INTO msg VALUES ('father Record'); SELECT COUNT(*) INTO cnt FROM msg; dbms_output.p

oracle自治事务

自治事务的使用,独立于外层的事务控制 create or replace procedure insert_err_po( OrderNo number,CycleId number ) is pragma autonomous_transaction; begin insert into tt_err_po(po_num_id,cycle_num_id) values(OrderNo,CycleId); commit; end;