这个触发器的需求是当T_BUSI_PRESEND_MX表插入以后,触发update set codetype=...
由于codetype的值是需要刚插入的id来查询出来的,所以必须先得到刚插入的id的值:create or replace trigger trg_after_table
after insert  
on T_BUSI_PRESEND_MX   
FOR EACH ROW
declare             
tr_mxid varchar2(20);
if insert(T_BUSI_PRESEND_MX)
begin
    update T_BUSI_PRESEND_MX set tr_mxid=(select id from T_BUSI_PRESEND_MX,inserted),CODETYPE=fn_numbertype(tr_mxid)
    where id=tr_mxid;
end;
end if;编译后 报标题错误,在线等 谢谢

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER TRG_AFTER_TABLE
      AFTER INSERT ON T_BUSI_PRESEND_MX
      FOR EACH ROW
    LZ逻辑不是很清晰,代码有语法错误,试着帮你改了下
    DECLARE
    BEGIN
      UPDATE T_BUSI_PRESEND_MX
         SET TR_MXID = :NEW.ID--这个id是新记录的id, 如果要用TR_MXID栏位的话直接换掉就可以
         , CODETYPE = FN_NUMBERTYPE(:NEW.TR_MXID)
       WHERE ID = :NEW.TR_MXID;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN;
    END;
    END IF;
      

  2.   

    LZ逻辑不是很清晰,代码有语法错误,试着帮你改了下
    CREATE OR REPLACE TRIGGER TRG_AFTER_TABLE
      AFTER INSERT ON T_BUSI_PRESEND_MX
      FOR EACH ROW
    DECLARE
    BEGIN
      UPDATE T_BUSI_PRESEND_MX
         SET TR_MXID = :NEW.ID--这个id是新记录的id, 如果要用TR_MXID栏位的话直接换掉就可以
         , CODETYPE = FN_NUMBERTYPE(:NEW.TR_MXID)
       WHERE ID = :NEW.TR_MXID;
    EXCEPTION
      WHEN OTHERS THEN
        RETURN;
    END;
    END IF;
      

  3.   

    if insert(T_BUSI_PRESEND_MX) then
      

  4.   

    -- 你这个触发器有严重的错误!不说啦:自己先去了解Oracle触发器方面的知识吧!
      

  5.   

    加了then也报错啊。这次不但报标题的错还多了一个 
    提示变量 tr_mxid 已声明 但从来没有使用过
      

  6.   


    变量名最好别与字段名相同:否则,有些时候,Oracle都不知道你的where条件到底是怎么比较?where id=tr_mxid;
      

  7.   


    照这个写了 你里面没有用if 后面有end if
    所以我把代码改成了这样
    create or replace trigger trg_after_table
    after insert   
    on T_BUSI_PRESEND_MX   
    declare            
    tr_mxid varchar2(20);begin
        update T_BUSI_PRESEND_MX set tr_mxid=new.id,CODETYPE=fn_numbertype(tr_mxid)
        where id=tr_mxid;
    end;说 new id 标识符无效
    sql statement ignored
      

  8.   

    问题好像出在
    insert的那一行没有commit,然后触发器又开始update 
    所以产生冲突