rowid切片,模拟oracle并行

来源:互联网 发布:数据库导入数据的方法 编辑:程序博客网 时间:2024/05/21 06:32
create or replace procedure para_update(v_jno in numberas
  v_rec job_info%rowtype;
begin
  update JOB_INFO set START_TIM=sysdate where jobno=v_jno;
  COMMIT;
  select * into v_rec from job_info where jobno = v_jno;
  if v_rec.start_rowid = v_rec.end_rowid then
    update test set status = 'AUTO' where rowid = v_rec.start_rowid;
  else
    update /*+ no_index(test test_obid)*/ test
       set status = 'AUTO'
     where rowid >= v_rec.start_rowid
       and rowid < v_rec.end_rowid
       and object_id BETWEEN 1000000 AND 2000000;
  end if;
    update JOB_INFO set end_TIM=sysdate where jobno=v_jno;
  commit;
end;
/
SELECT COUNT(*) FROM TEST WHERE ......
declare
  n_job number;
begin
  execute immediate 'truncate table job_info';
  for i in (select rid s_rid,
                   lead(rid, 1, rid) over(order by rn) e_rid
              from (select rn, rid
                      from (select row_number()over(order by rowid) rn,
                                   rowid rid,
                                   count(*) over() total_rows
                              from test
                             where object_id BETWEEN 1000000 AND 2000000)
                     where rn in (select trunc(&&total_rows *level / &&level)
                                    from dual
                                  connect by level <= &&level
                                  union
                                  select 1
                                    from dual))) loop
    dbms_job.submit(n_job, 'para_update(JOB);');
    insert into job_info
      (jobno, start_rowid, end_rowid)
    values
      (n_job, i.s_rid, i.e_rid);
  end loop;
end;
/
commit;  

SELECT JOBNO,TO_CHAR(START_TIM,'YYYYMMDD HH24:MI:SS'),TO_CHAR(END_TIM,'YYYYMMDD HH24:MI:SS'FROM JOB_INFO; 
0 0