假设: 我向 A 表insert 的时候触发.
  
    触发内容是: 向B 表插入多条记录.(要根据insert A表的数据,来处理.)
 问题就来了: 当我向 B 表插入数据的时候, 我获取不到 A 表的数据,(事务还木有提交) 所以我就不发 向B 表insert数据. 怎么解决种类问题呢?

解决方案 »

  1.   

    我给你写个测试代码,你可以参考下
    1.创建表
    create table TEST1
    (
      NAME VARCHAR2(20),
      CODE VARCHAR2(4),
      FULL VARCHAR2(50)
    )
    tablespace test_table
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64
        minextents 1
        maxextents unlimited
      );2、创建package
    create or replace package pkg_test1 as
      type t_gno is table of test1.code%type index by binary_integer;
      v_gno         t_gno;
      v_numbertries binary_integer := 0;
    end pkg_test1;3、创建触发器1
    create or replace trigger tr_test1_row
      before insert or update of code on test1
      for each row
    begin
      pkg_test1.v_numbertries := pkg_test1.v_numbertries + 1;
      pkg_test1.v_gno(pkg_test1.v_numbertries) := :new.code;
    end tr_test1_row;4、创建触发器2
    create or replace trigger tr_test1_tb
    after insert or update of code on test1
    declare
      v_gatejob_no test1.code%type;
    begin
      for v_loopindex in 1 .. pkg_test1.v_numbertries loop
        v_gatejob_no := pkg_test1.v_gno(v_loopindex);
        update test1
           set full = 'lily';
      end loop;
    end tr_test1_tb;
      

  2.   

    不用搞得这么麻烦吧.直接建一个存储过程.插入值的时候调用下存储过程.举一个简单的例子:
    假如A表B表只有一列,类型是int.当往A中插入数据成功后.对插入值进行判断,如果大于5就向B中插入该值加1的值.如果插入A表失败(比如违反约束条件等)就不会向B中插入值.
    create or replace procedure insert_value(v_insert in int)
    is
    begin
    insert into A values(v_insert);--如果此处插入失败会抛出异常并跳到异常处理语句不会执行下面语句
    commit;
    if(v_insert > 5) then
    insert into B values(v_insert + 1);
    commit;
    end if;
    --exception 
    --when others then
    --insert into B values(v_insert + 1);-如果想让插入A失败时仍插入B则把注释掉的语句加上
    end;
      

  3.   

    A中的数据都可以获取到,当前插入A中的数据在触发器中是可以看到和取到的new:xxxxx