create or replace trigger MoOpList_in_up_row_trigger
Before  insert or update   --After Before
on ModelOperateList
for each row
declare 
crmModuleRow crmModule%rowtype;
operateRow operate%rowtype;
begin
  select * into crmModuleRow from crmModule where crmModuleId=:new.crmModuleId;
  select * into operateRow from operate where operateid=:new.operateid;
  update ModelOperateList set  mooplistname=crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName 
         where mooplistid=:new.mooplistid;
  dbms_output.put_line(crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName);
end;
我想修改刚插入或刚更新的那条数据,
需求是 ModelOperateList表的 mooplistname 字段是 crmModule 和 operate  两个表的名称字段拼接而成的,测试 新增 数据是新增进去了,mooplistname 字段没得到拼接的值(dbms_output输出正常),
修改报错。请教各位前辈,有办法能达到我要的需求吗?

解决方案 »

  1.   


    update ModelOperateList set  mooplistname=crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName 
             where mooplistid=:new.mooplistid;==>
    :new.mooplistname:=crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName;
      

  2.   

    before 的时候,字段的内容还没有写入数据库 
    你从这里update 但是不改变:new的值 update的数据又没有提交 所以你的update是无效的,值被冲掉了
    触发器里又不支持commit操作 所以 你可以如楼上所说 把update语句换成给:new赋值
    也可以在after中做update(这个我没有测试,不确定可不可行)
      

  3.   


    你的运行应该报错了 发生了变异表事件update ModelOperateList set  mooplistname=crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName 
             where mooplistid=:new.mooplistid;改成
    :new.mooplistname=crmModuleRow.crmModuleNameEN||'_'||operateRow.operateName ;