暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle 使用批量收集的数据更新

askTom 2017-02-14
305

问题描述

嗨,汤姆,我对PLSQL世界有点新手,并试图编写一个块来读取clob数据并将其更新 (仅前4000个字节,因为我们仍在使用11g) 到varchar列。块已经准备好了,但是当我用一些好的行 (接近70 K) 执行时,它似乎没有从循环中出来,性能也很差。你能提出什么建议吗?这是代码:

将serveroutput设置为on;
声明
类型CMPLN_temp_clob_aat是CMPLN_temp_clob % ROWTYPE的表;
l_CMPLN_temp_clob cmpln_temp_clob_clob_aat;
光标CMPLN_temp_clob_cur从QAD_CMS.CMPLN_temp_clob中选择 *;
l_data_1 VARCHAR2(32767);
l_data_2 VARCHAR2(32767);
l_data_3 VARCHAR2(32767);
l_data_4 VARCHAR2(32767);
l_data_5 VARCHAR2(32767);
l_data_6 VARCHAR2(32767);
l_data_7 VARCHAR2(32767);
l_data_8 VARCHAR2(32767);
l_data_9 VARCHAR2(32767);

开始
打开CMPLN_temp_clob_cur;
循环
将CMPLN_temp_clob_cur批量收集到l_CMPLN_temp_clob限制5000中;
对于indx IN 1 ..L_cmpln_temp_clob.计数
循环
l_data_1 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx)。评估qsnr,4000,1,4000);
l_data_2 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx).CLSR_SUMRY,4000,1,4000);
l_data_3 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx).EVAL_RTNL,4000,1,4000);
l_data_4 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx)。FLLW_UP_INFO,4000,1),1,4000);
l_data_5 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx).SMPL_CMNT,4000,1,4000);
l_data_6 := substib (dbms_lob.substr(l_CMPLN_temp_clob(indx).SRC_SYS_DESCR,4000,1,4000);
l_data_7 := substsubb (dbms_lob.substr(l_CMPLN_temp_clob(indx).MED_SFTY_RVW,4000,1,4000);
l_data_8 := substib (dbms_lob.Substr (l_CMPLN_temp_clob(indx).ADDL_MED_SFTY_RVW,4000,1,4000);
l_data_9 := substsubb (dbms_lob.substr(l_CMPLN_temp_clob(indx).EVNT_DESCR,4000,1,4000);
更新
QAD_CMS.CMPLN_temp_clob集
评估 _ qsnr_shrt = l_data_1,
CLSR_SUMRY_SHRT = l_data_2,
评估 _rtnl_shrt = l_data_3,
FLLW_UP_INFO_SHRT = l_data_4,
Smpl _ cmnt _ shrt = l_data_5,
Src _ 系统 _ 描述 _ shrt = l_data_6,
医学 _ sfty_rvw_shrt = l_data_7,
地址 _ 医疗 _ sfty_rvw_shrt = l_data_8,
EVNT_DESCR_SHRT = l_data_9
其中CMPLN_pr_id = l_CMPLN_temp_clob(indx)。CMPLN_pr_id;
提交;
END 循环;
提交;
当CMPLN_temp_clob_cur % 未找到时退出;
END 循环;
关闭CMPLN_temp_clob_cur;
提交;
结束;

我使用PLSQL块的原因也是因为我们在源中有多字节字符,因此substr(clob,1,4000) 并不总是提供4000字节的数据

专家解答

尝试这样的东西 (显然我不能在我的数据库上编译这个,但关键点是)

-使用光标来获取数据,而不是执行所有这些分配
-批量绑定更新
-没有不必要的承诺

Set serveroutput on;

declare

cursor c is 
   SELECT CMPLN_pr_id, 
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).ASSESS_QSNR, 4000, 1 ),1,4000) c1
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).CLSR_SUMRY, 4000, 1 ),1,4000) c2
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).EVAL_RTNL, 4000, 1 ),1,4000) c3
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).FLLW_UP_INFO, 4000, 1 ),1,4000) c4
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).SMPL_CMNT, 4000, 1 ),1,4000) c5
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).SRC_SYS_DESCR, 4000, 1 ),1,4000) c6
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).MED_SFTY_RVW, 4000, 1 ),1,4000) c7
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).ADDL_MED_SFTY_RVW, 4000, 1 ),1,4000) c8
          substrb(dbms_lob.substr(l_CMPLN_temp_clob(indx).EVNT_DESCR, 4000, 1 ),1,4000) c9
   FROM QAD_CMS.CMPLN_temp_clob;

TYPE CMPLN_temp_clob_aat IS TABLE OF c%ROWTYPE index by pls_integer;
l_CMPLN_temp_clob CMPLN_temp_clob_aat;


open c;
loop
  fetch c BULK COLLECT into l_CMPLN_temp_clob LIMIT 5000;
  exit when l_CMPLN_temp_clob.count = 0;

  forall indx in 1 .. l_CMPLN_temp_clob.count
    update  QAD_CMS.CMPLN_temp_clob 
    set 
    ASSESS_QSNR_SHRT=l_CMPLN_temp_clob(indx).c1, 
    CLSR_SUMRY_SHRT=l_CMPLN_temp_clob(indx).c2,
    EVAL_RTNL_SHRT=l_CMPLN_temp_clob(indx).c3,
    FLLW_UP_INFO_SHRT=l_CMPLN_temp_clob(indx).c4, 
    SMPL_CMNT_SHRT=l_CMPLN_temp_clob(indx).c5,
    SRC_SYS_DESCR_SHRT=l_CMPLN_temp_clob(indx).c6, 
    MED_SFTY_RVW_SHRT=l_CMPLN_temp_clob(indx).c7,
    ADDL_MED_SFTY_RVW_SHRT=l_CMPLN_temp_clob(indx).c8, 
    EVNT_DESCR_SHRT=l_CMPLN_temp_clob(indx).c9
    where CMPLN_pr_id=l_CMPLN_temp_clob(indx).CMPLN_pr_id;


END LOOP;

commit;

CLOSE CMPLN_temp_clob_cur;

end ;



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论