rowid切片,模擬oracle並行
create or replace procedure para_update(v_jno in number) as
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.