CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  高级技术

为何触发器有时报错,有时不报错?很急,谢谢!

楼主robinww(robinww)2005-07-25 13:24:24 在 Oracle / 高级技术 提问

我有两张表  
  create   table   STD_STATS_TOTAL  
  (  
      SWITCH_ID           NUMBER(4),  
      CALLING_DATE     CHAR(14),  
      CALLING_TIME     CHAR(2),  
      EXCHANGE_CODE   VARCHAR2(6),  
      COUNTS                 NUMBER(14)  
  );  
   
  create   table   WW_TEST  
  (  
      SWITCH_ID           NUMBER(4),  
      CALLING_DATE     CHAR(14),  
      CALLING_TIME     CHAR(2),  
      EXCHANGE_CODE   VARCHAR2(6),  
      COUNTS                 NUMBER(14)  
  );  
  insert   into   WW_TEST   (SWITCH_ID,   CALLING_DATE,   CALLING_TIME,   EXCHANGE_CODE,   COUNTS)  
  values   (1001,   '20050720',   '18',   'total',   10);  
   
   
  我对STD_STATS_TOTAL表建一个触发器  
  -------------以下是触发器-------------  
  create   or   replace   trigger   befor_ins_std_stats_total  
      before   insert   on   std_stats_total      
      for   each   row  
  declare  
   
      v_counts   number(14);  
       
  begin  
       
      select   sum(counts)  
      into   v_counts  
      from   std_stats_total  
      where   switch_id   =   :new.switch_id   and   calling_date   =   :new.calling_date    
      and   exchange_code   =   :new.exchange_code   and   calling_time   =   :new.calling_time   ;  
       
      if   v_counts   !=   0  
      then    
                 
                delete   from   std_stats_total  
                where     switch_id   =   :new.switch_id   and   calling_date   =   :new.calling_date    
                and   exchange_code   =   :new.exchange_code   and   calling_time   =   :new.calling_time   ;  
                 
                :new.counts   :=   v_counts   +   :new.counts;  
         
        end   if   ;  
         
                 
  end   befor_ins_std_stats_total;  
   
  -----------------以上是触发器-------------------  
  这个触发器的功能是当插入一条记录时,检查表中是否有除了counts外,其他字段一样的记录,如果有的话,就将counts值相加,原来的记录删去。  
   
   
   
  我执行:  
  insert   into   std_stats_total   values   (1001,'20050720','18','total',10);  
  语句的时候,触发器正常执行。  
   
  但我执行这样的语句:insert   into   std_stats_total   select   *   from   ww_test;的时候却报错:  
  SQL>    
   
  insert   into   std_stats_total   select   *   from   ww_test  
   
  ORA-04091:   table   BILL.STD_STATS_TOTAL   is   mutating,   trigger/function   may   not   see   it  
  ORA-06512:   at   "BILL.BEFOR_INS_STD_STATS_TOTAL",   line   6  
  ORA-04088:   error   during   execution   of   trigger   'BILL.BEFOR_INS_STD_STATS_TOTAL'  
   
  Commit   complete  
   
  SQL>    
   
   
  为何插入有具体值的记录时不报错,从表里查数据插入的时候要报错?要怎样修改?  
  问题点数:20、回复次数:2Top

1 楼zjw7789(随风)回复于 2005-07-25 16:50:38 得分 20

逻辑错误:  
  以插入数据之前为触发条件的触发器不允许对载体表进行sum操作  
  Top

2 楼robinww(robinww)回复于 2005-07-26 16:14:07 得分 0

但是我用insert   into   std_stats_total   values   (1001,'20050720','18','total',10);这样的语句时,触发器是可以执行的呀?  
  Top

相关问题

  • 急!触发器
  • 触发器insert事件报错
  • 触发器的问题,急!
  • 求触发器代码...急
  • 触发器求助。。。。急。。。。。
  • 急啊 ?触发器问题...
  • 触发器问题,急!
  • 关于触发器,急问!!
  • 各位老大我在oracle817里创建触发器:报错:无效的触发器类型!
  • 初学触发器,建了一个简单的触发器都报错,郁闷中。

关键词

  • 语句
  • 执行
  • exchange
  • date
  • code
  • 触发器
  • 报错
  • stats
  • total
  • std

得分解答快速导航

  • 帖主:robinww
  • zjw7789

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo