SQL行计数与定义为10000的数组计数不同.请提出建议.期望的SQL行计数应与10000相同

  • 本文关键字:SQL 10000 期望 相同 数组 定义 arrays oracle plsql
  • 更新时间 :
  • 英文 :

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可以看到在同一事务中完成的更新。

顺便说一句,这是典型的跨提交获取示例。

最新更新