在trigger中 :new :old 啥意思呀?
比如说:v_mo_msg := upper(:new.msg); 
第一次接触到trigger,谢谢啦!
:)

解决方案 »

  1.   

    :new.字段 是该字段修改后的值,:old.字段 是该字段修改前的值。
      

  2.   

    3. 新旧值的获取
     
    在触发器中,有时候需要使用相关表修改前/后的值,可以使用 :new 和 :old 来获取。你可以把 :new/:old 看作是相关表的一条记录,通过它们来获取到相关列的数值。它们只能用在行级触发器中。
     
    SQL> drop table t1 purge;
     
    表已丢弃。
     
    SQL> create table t1 (old number(1), new number(1));
     
    表已创建。
     
    SQL> truncate table t2;
     
    表已截掉。
    SQL> create or replace trigger tri_t2
      2  before insert or update or delete on t2
      3  begin
      4    insert into t1 values(:old.x, :new.x);
      5  end;
      6  /
    create or replace trigger tri_t2
                              *
    ERROR 位于第 1 行:
    ORA-04082: NEW 或 OLD 引用不允许在表级触发器中
     SQL> create or replace trigger tri_t2
      2  before insert or update or delete on t2 for each row
      3  begin
      4    insert into t1 values(:old.x, :new.x);
      5  end;
      6  /
     
    触发器已创建
     
    SQL> insert into t2 values(1);
     
    已创建 1 行。
     
    SQL> select * from t1;
     
           OLD        NEW
    ---------- ----------
                        1
     
    SQL> update t2 set x = 2;
     
    已更新 1 行。
     
    SQL> select * from t1;
     
           OLD        NEW
    ---------- ----------
                        1
             1          2
     
    SQL> delete t2;
     
    已删除 1 行。
     
    SQL> select * from t1;
     
           OLD        NEW
    ---------- ----------
                        1
             1          2
             2
      

  3.   

    "ERROR 位于第 1 行: 
    ORA-04082: NEW 或 OLD 引用不允许在表级触发器中"这句啥意思?不明白 (*^__^*) ……
      

  4.   

    这个俺知道
    我是想问为啥创建失败了,刚又看了下,语法错误,您第一次创建时,忘记 for each row 了。谢谢啦
    before insert or update or delete on t2 for each row 
      

  5.   


    行级trigger才能使用old new,也就是你这样提到的for each row.表级trigger是不能使用old new的
      

  6.   

    表级触发器而不是针到行,所以NEW,OLD就没有对应的行了,所以出错.
      

  7.   

    接着再问,这种情况我测试是不会走到if语句块里去的,请问这是为什么?
    难不成是null值跟非null值比较,null!=非null 这种返回值是false 才导致不进去if语句块的?
    请高手指点迷津^_^
    给v_str1_no赋个值,只要不为空,就会进入if语句块
    DECLARE
     v_str1_no VARCHAR2(10);
        v_str2_no VARCHAR2(10):='ss';
    begin
      -- Call the procedure
     
    IF(v_str2_no IS NOT NULL AND  v_str2_no !=v_str1_no ) THEN
            
      action; END IF;                                        
                                             
    end;