说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

谁能拿出一个好的策略(关于ORACLE中的TRIGGER问题)

编辑:说三道四文库 发布时间:2018-05-21 03:04
HTML文档下载 WORD文档下载 PDF文档下载
我有表table_a(row_id,plan_flg,status_flg,par_row_id)自关联
             ~~~~                   ~~~~~~
                ∧                          ‖
                ‖__________________________‖

其中:row_id(PK)  varchar2(16)
      plan_flg   char(1)/'p':primary,'a':act(调整)
      status_flg  char(1)/'0','1'     
      par_row_id(原row_id)  varchar2(16)

示例数据:
row_id,plan_flg,status_flg,par_row_id 
   1 ,  p     ,   0      ,  null
   2 ,  p     ,   0      ,  null
   3 ,   a     ,   0      ,   1
   4 ,   a     ,   0      ,   1
   
 ~~~~~~~~~~~~~~~~   
             ‖
           ∨

   1 ,  p     ,   1      ,  null
   2 ,  p     ,   0      ,  null
   3 ,   a     ,   1      ,   1
   4 ,   a     ,   1      ,   1
 


要求:
  1、当plan_plg为'p'的记录的status_flg 从'0'变成'1'时 ,将表中
所有par_row_id为当前记录row_id 的记录的status_flg更新为'1'
  2、尽量不使用临时表和JOB


create trigger atrigger 
    after update of status_flg 
    on table_a 
    for each row 
    when (status_flg='1')
  update table_a set status_flg=1 where par_row_id=:new.row_id
when 字句应该是
    when (new.status_flg='1')
可是ORACLE中,在触发器内是禁止对变化表进行UPDATE的,
大虾,救命啊...
你说的不错.
实现比较麻烦,先建一个Package,定义一些全局变量,
然后在表上建立一个语句级触发器,和一个行级触发器。
因为ORACLE中对行级触发器的限制不允许修改变化表,但是对语句级触发器没有限制。
所以在行级触发器中将需要修改的东西存储在Package的变量中,在语句级触发器中读取,
然后修改变化表。
thanks,试试先
噢,在ORACLE中,这种情况是被严格禁止的,还是省省力气用JOB吧
昨天我想了一下,可能要对你的表结构进行小的修改,语句如下:
alter table yourtable add column flag number(1) default 0;
当你将status_flg从0改为1时同时也将flag的值修为1.即
update yourtable set status_flg=1,flag=1
更新时使用
update yourtable set status_flg=1 where flag=1;和
update yourtable set flag=0;
采用helios(太阳神) 的建议:
   在语句级触发器中,update table_a set other_field ='$#' where ...,是可以的;
                                      ~~~~~~~~~~~~~~~~~~ 
但是,update table_a set status_flg ='1' where ...就不行了。
                        ~~~~~~~~~~~~~~~~
因为我的行级触发器when (old.status_flg ='2' and new.status_flg ='3'),大家再帮我
想想办法吧,再20分
when (old.status_flg ='0' and new.status_flg ='1')
我也是常碰到变化表的问题,解决方法是写个procedure,然后在做完每个Insert命令后,再条用
这个procedure,别的实在没什么好方法。
谢谢诸位
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘