视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle多进程更新同一个表
2020-11-09 10:30:20 责编:小采
文档

因业务表在数据转换时,相应的标识符没有加上,故需多进程对同一张表操作,从而提高更新的效率。

因业务表在数据转换时,,相应的标识符没有加上,故需多进程对同一张表操作,从而提高更新的效率。

1、写好相应的存储过程:

create or replace procedure proc_update_XXX(being_num in integer,end_num in integer) is

cursor c_table is
select * from(
select a.*, row_number() over(order by rowid) rk from table a
) where rk>being_num and rk<=end_num;

v_table c_table%rowtype;

i integer;
begin
i := 0;

...

end;

2、多进程:使用DBMS_SCHEDULER.CREATE_JOB实现

相应的存储过程如下:(也可以改写成匿名快来执行)

create or replace procedure PROC_JOB_XXX IS
V_MAX_THREAD INTEGER;
STR_JOB VARCHAR2(500);
PRM_HAD_UPDATE VARCHAR2(20);
PRM_HAD_UPDATE_1 integer;
PRM_HAD_UPDATE_2 integer;

BEGIN
V_MAX_THREAD := 8;--进程数目

select V_HAD_NUM INTO PRM_HAD_UPDATE from TMEMP_HADUPDATE_LCM_20140124;--已更新的数目

FOR X IN 0 .. V_MAX_THREAD-1 LOOP
PRM_HAD_UPDATE_1 := PRM_HAD_UPDATE +X*100;
PRM_HAD_UPDATE_2 := PRM_HAD_UPDATE +(X+1)*100;

STR_JOB := 'DECLARE

BEGIN
proc_update_XXX('''|| PRM_HAD_UPDATE_1 ||''' ,''' ||PRM_HAD_UPDATE_2 ||''' );
END;';

DBMS_SCHEDULER.CREATE_JOB(JOB_NAME => 'UPDATE_XXX_THREAD_' || X,
JOB_TYPE => 'PLSQL_BLOCK',
JOB_ACTION => STR_JOB,
ENABLED => FALSE,
AUTO_DROP => TRUE,
COMMENTS => 'proc_update_XXX_' || X);

DBMS_SCHEDULER.ENABLE(NAME => 'UPDATE_XXXX_THREAD_' || X);
end loop; UPDATE TMEMP_HADUPDATE_LCM_20140124
SET V_HAD_NUM =PRM_HAD_UPDATE + 100 *V_MAX_THREAD;
COMMIT;

END;

下载本文
显示全文
专题