开发者社区> 问答> 正文

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

就一个简单的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 ;

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

望各路大仙指点,敬礼!

 

展开
收起
爱吃鱼的程序员 2020-06-08 11:39:03 753 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    你的事务怎么处理的?

    createindexi1_FARE_FAREMAINonFARE_FAREMAIN(fare_nruleid);

    建上索引,更新就快了。

    2020-06-08 11:39:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像