oracle11g存储过程循环更新有啥具体讲究?

royalZJ 发布于 2017/08/15 11:49
阅读 323
收藏 0

就一个简单的for循环  update操作  存储过程的语法没啥问题,执行另一个表(100 W+的数据)花费25分钟左右结束,但是执行当前表(44W+的数据)却一直显示执行中,不结束也不报错,强制停止后,发现三四十分钟才update生效了100条左右的数据。不过,在执行存储过程之前,有对此表进行过字段类型的变更操作,如下:

--修改FARE_FAREMAIN表的FARE_NRULEID 的字段类型number(10)为VARCHAR2(20)
-- Add/modify columns  (耗时约50秒)
alter table airfare.fare_faremain rename column FARE_NRULEID to FARE_NRULEID_temp;
alter table airfare.fare_faremain add FARE_NRULEID VARCHAR2(20);
update airfare.fare_faremain set FARE_NRULEID = trim(FARE_NRULEID_temp) ;
alter table  airfare.fare_faremain drop column FARE_NRULEID_temp;

 

执行一直不结束的存储过程,如下:

CREATE OR REPLACE PROCEDURE PRO_INIT_faremain_bak0523 AS
BEGIN
  FOR OBJFFG IN (select rr.rule_nid a, rf.rf_rulefileid b
                   from airfare.RULE_RULE rr, airfare.rulefile rf
                  where rr.rule_nid = rf.rf_ruleid) LOOP
  
    update airfare.FARE_FAREMAIN ff
       set ff.fare_nruleid = OBJFFG.b
     where ff.fare_nruleid = OBJFFG.a;
    COMMIT;
  END LOOP;
end ;

(另外,此表主键约和索引啥的都是正常)

望各路大仙指点,敬礼!

 

加载中
0
沧海_Sea
沧海_Sea

你的事务怎么处理的?

0
Raveh
Raveh

create index i1_FARE_FAREMAIN on FARE_FAREMAIN(fare_nruleid);

建上索引,更新就快了。

返回顶部
顶部