if [ "${ARRAY_SIZE}" = "" ];then
ARRAY_SIZE=10000
fi
declare
type t_reqseqArray is table of TEMP_TABLE_BKP.REQ_SEQ%type;
v_reqseqArray t_reqseqArray;
v_array_limit number(5) := ${ARRAY_SIZE};
v_commit_rate number(5) := ${COMMIT_RATE};
v_fetch_count number(5) := 0;
cursor c_reqseq is select req_seq from TEMP_TABLE_bkp;
v_TEMP_TABLE_bkp number(16) := 0;
v_array number(16) := 0;
begin
open c_reqseq;
loop
v_fetch_count := v_fetch_count + 1;
fetch c_reqseq bulk collect into v_reqseqArray limit v_array_limit;
v_array := v_reqseqArray.count;
dbms_output.put_line('Array count, '||to_char(v_array,'9999999')||' Request Sequences got');
forall idx in 1..v_reqseqArray.count
update TEMP_TABLE_bkp set req_seq=req_seq+1 where req_seq = v_reqseqArray(idx);
v_TEMP_TABLE_bkp := sql%rowcount;
exit when c_reqseq%notfound;
if (v_fetch_count >= v_commit_rate) then
dbms_output.put_line('Commit point reached, '||to_char(v_TEMP_TABLE_bkp,'9999999')||' Request Sequences got updated.');
${COMMIT};
v_fetch_count := 0;
end if;
end loop;
close c_reqseq;
end;
/
结果显示,数组计数为10000,其中SQL行计数为12907。
数组计数,10000获得请求序列12907已达到提交点,127070000获得请求序列8660已达到提交点,8.660请求序列已更新。数组计数,4001已获取请求序列2434
sql%rowcount
是整个forall .. update
语句更新的行数,而不是FORALL执行DML的次数。一次更新可以影响许多行。
您还可以检查SQL%BULK_ROWCOUNT
伪集合,它包含FORALL执行的每个DML语句所影响的行数,您会看到,对于某些值v_reqseqArray(idx(,它更新了许多行。
还要记住,您的事务会看到您的更新:游标包含旧值,表包含更新的值,UPDATE可以看到在同一事务中完成的更新。
顺便说一句,这是典型的跨提交获取示例。