首页   |   IT资讯   |   综合资讯   |   开发   |   软件   |   问答   |   网络技术   |   网络综合
更多:
当前位置:首页 » 手机数码
文章正文

触发器错误!!ORA-04091:表..发生了变化,触发器/函数不能读,---在线等待!!

类型:转载   责任编辑:asp   日期:2007/03/01

    

aa表为表头  
  bb表为名细,  
  bb上建有触发器,删除记录时需要读取表头的信息,并据此做相应的处理;  
   
  aa上用触发器实现aa-->bb的级连删除  
   
  脚本如下:  
  直接删除bb表记录没有问题,但试图删除aa表记录时出错;  
  可能是执行操作的顺序有问题,即级连删除时不能访问表头(以被修改)  
  但要想实现上面的功能应该怎么修改呢?  
  =================================================================  
   
  create   table   aa(  
  no   varchar2(5),  
  flag   varchar2(1)  
  );  
   
  create   table   bb(  
  no   varchar2(5),  
  dd   varchar2(10));  
   
  create   or   replace   trigger   ord_aa_tr   before   delete   on   aa   for   each   row  
  begin  
          delete   from   bb   where   no=:old.no;  
  end   ord_aa_tr;  
  /  
   
  create   or   replace   trigger   ord_bb_tr   before   delete   on   bb   for   each   row  
  declare  
      q     varchar2(10);  
  begin  
          select   flag   into   q   from   aa   where   no=:old.no;  
          --......其它处理  
  end   ord_aa_tr;  
  /  
   
  insert   into   aa   values(001,1);  
  insert   into   bb   values(001,abc);  
   
  delete   from   aa;  
   
  error   位于第   1   行:  
  ora-04091:   表   ccduser.aa   发生了变化,触发器/函数不能读  
  ora-06512:   在"ccduser.ord_bb_tr",   line   4  
  ora-04088:   触发器   ccduser.ord_bb_tr   执行过程中出错  
  ora-06512:   在"ccduser.ord_aa_tr",   line   2  
  ora-04088:   触发器   ccduser.ord_aa_tr   执行过程中出错  
   
  ================================================================  
 

推荐阅读

  • 是充电器还是飞碟 苹果配件不一般 [详细内容]
  • 关于闹钟 [详细内容]
  • 绝对值得关注 五款3500元级热门机型导购 [详细内容]
  • 经典在延续!升技NV8再到货价格更实惠 [详细内容]
  • 苏宁电器10股送2.5股 [详细内容]
  • 全静音设计 技嘉6600GT AGP狂降380元 [详细内容]
  • INTEL明年第二季度正式推出965芯片组 [详细内容]
  • 网友回答:
    网友:bzszp

    形成循环了!  
      这样不行

    网友:bzszp

    可以通过另外一个表  
      保存需要的信息  
      通过触发器保存起来  
      然后再取出来用

    网友:beckhambobo

    select   flag   into   q   from   aa   where   no=:old.no;  
      exception  
      when   others   then  
      ...  
      end;  
       
      但楼主语句没有涉及循环触发。

    网友:bzszp

    对aa表执行行级触发器的时候  
      触发bb表的触发器,读aa表中数据//不可以这样

    网友:beckhambobo

    楼主意思是否每论删除a、b都想得到flag值呢?  
      select   flag   into   q   from   aa   where   no=:old.no;  
      那可以用函数来实现了。  
       
      create   or   replace   function   get_flag(p_id   in   varchar2)  
      return   varchar2  
      as  
      v_q   varchar2(10);  
      begin  
      select   flag   into   q   from   aa   where   no=p_id;  
      return   v_q;  
      end;  
      /  
       
      create   or   replace   trigger   ord_aa_tr   before   delete   on   aa   for   each   row  
      declare  
      rt   varchar2(10);  
      begin  
              rt:=get_flag(:old.no);  
              delete   from   bb   where   no=:old.no;  
      end   ord_aa_tr;  
      /  
       
      create   or   replace   trigger   ord_bb_tr   before   delete   on   bb   for   each   row  
      declare  
          q     varchar2(10);  
      begin  
               
              q:=get_flag(:old.no);  
              --......其它处理  
      end   ord_aa_tr;  
      /  
     

    .
      最佳浏览:1024X768 MSIE
    ©2007 jqmk.com.cn All Rights Reserved