项目中遇到个问题,我对一个表插入了一行后,要马上对新插入的这行的某几列属性进行update,请问利用触发器应该如何实现?

解决方案 »

  1.   

    create or replace trigger tg_tt
    before insert 
    on tt
    for each row
    begin
    :new.col1:='XXX';
    :new.col2:='XXX';
    ....
    end tg_tt;
      

  2.   

    可能是我没表达清楚,我现在是先插入一行数据,然后update插入的这一行的某几列。
      

  3.   

    create or replace trigger tg_tt 
    after insert 
    on tt 
    for each row 
    begin 
    :new.col1:='XXX'; 
    :new.col2:='XXX'; 
    .... 
    end tg_tt;
      

  4.   

    我自己写的SQL如下,麻烦大家帮忙看看,有什么问题。create  or replace trigger set_booknumber
    before insert
    on app_assetcustominfo60
    for each row
    declare   num   number(10)   
    begin
     SELECT SERIALNUMBER INTO num FROM app_bookserialnum;
     IF  num< 0 then
      num =1;
      else
      num = num+1;
      end if
      update app_bookserialnum set SERIALNUMBER = num;
      new.BOOKSERIALNUM = num;
    end set_booknumber;
    commit;
      

  5.   

    SELECT SERIALNUMBER INTO num FROM app_bookserialnum;
    这是什么意思,返回记录数吗
    app_bookserialnum和app_assetcustominfo60
    不是一个表?
    SELECT SERIALNUMBER INTO num FROM app_bookserialnum;
    如果记录条数不为1会出错
    num =1;
    赋值要用num:=1
    new前要加:
    还有';'号
    错误很多
    你描述清楚,再试着帮你改
      

  6.   

    create  or replace trigger set_booknumber
    before insert
    on app_assetcustominfo60
    for each row
      
    begin
      IF  :new.SERIALNUMBER< 0 then
      :new.SERIALNUMBER :=1;
      else
      :new.SERIALNUMBER:=:new.SERIALNUMBER+1;
      end if;
    end set_booknumber;
      

  7.   

    SELECT SERIALNUMBER INTO num FROM app_bookserialnum;
    这是什么意思,返回记录数吗
    app_bookserialnum表只有一条记录,用来存放一个数字,我的本意是要取得SERIALNUMBER 列的值。
    app_bookserialnum和app_assetcustominfo60
    不是一个表? 
    app_bookserialnum和app_assetcustominfo60不是一个表,要从app_bookserialnum中取得SERIALNUMBER 列的值,加1后插入app_assetcustominfo60表的BOOKSERIALNUM列,(BOOKSERIALNUM列的值更新没有在insert语句中,需要将BOOKSERIALNUM列的值加入insert语句中。)同时更新app_bookserialnum表的SERIALNUMBER 列的值。
      

  8.   

    那么你稍微修改下原句的语法错误试试create  or replace trigger set_booknumber
    before insert
    on app_assetcustominfo60
    for each row
    declare 
    num number;
    begin
     SELECT SERIALNUMBER INTO num FROM app_bookserialnum;
     IF  num< 0 then
      num :=1;
      else
      num := num+1;
      end if;
      update app_bookserialnum set SERIALNUMBER = num;
      :new.BOOKSERIALNUM := num;
    end set_booknumber;
      

  9.   

    报错误:ORA-04098: 触发器 'WENTONGUSER.SET_BOOKNUMBER' 无效且未通过重新确认
      

  10.   

    我觉得,你这样建个表,还建触发器
    若是只为了设置BOOKSERIALNUM递增的话,还是创建序列比较好
    你查下app_bookserialnum表的值,若为100则
    create sequence seq_app
    start with 101;
    插入app_assetcustominfo60 的时候
    insert into app_assetcustominfo60 values(seq_app.nextval...)
    用seq_app.nextval填充BOOKSERIALNUM值,自动递增
    触发器和那个辅助表就可以删了
      

  11.   

    现在的问题是我得不到insert的语句,那个语句是个接口调用的,都打包进jar里面去了,只能迂回考虑。
    刚重新试了下,又没问题了
    问题解决了,结贴,感谢wildwave和oraclemch的帮助。