حلقة المؤشر ومتابعة البيان: سلوك غير متوقع

StackOverflow https://stackoverflow.com/questions/968854

  •  13-09-2019
  •  | 
  •  

سؤال

قد أكون مطلاشة في شيء بسبب الإجهاد الموعد النهائي. ولكن هذا السلوك يدهشني. يبدو أنه إذا كان مؤشر التخزين المؤقت 100 صفوف وبيان متابعة يزيل ذاكرة التخزين المؤقت ويبدأ بالسجل الأول لجلب ذاكرة التخزين المؤقت الجديدة.

ضاقت إليه إلى البرنامج النصي التالي:

drop table test1;

create table test1 (test1_id NUMBER);

begin
  for i in 1..300
  loop
    insert into test1 values (i);
  end loop;
end;
/

declare
  cursor c_test1 is
  select *
  from test1;
begin
  for c in c_test1
  loop
     if mod(c.test1_id,10) = 0
     then
      dbms_output.put_line(c_test1%ROWCOUNT||' '||c.test1_id||' Continue');
      continue;
     end if;
     dbms_output.put_line(c_test1%ROWCOUNT||' '||c.test1_id||' Process');
  end loop;
end;
/

1 1 Process
2 2 Process
3 3 Process
4 4 Process
5 5 Process
6 6 Process
7 7 Process
8 8 Process
9 9 Process
10 10 Continue **Where are tes1_id's 11 to 100?** 
11 101 Process
12 102 Process
13 103 Process
14 104 Process
15 105 Process
16 106 Process
17 107 Process
18 108 Process
19 109 Process
20 110 Continue **Where are tes1_id's 111 to 200?** 
21 201 Process
22 202 Process
23 203 Process
24 204 Process
25 205 Process
26 206 Process
27 207 Process
28 208 Process
29 209 Process
30 210 Continue **Where are tes1_id's 211 to 300?** 


Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
PL/SQL Release 11.1.0.7.0 - Production
redhat release 5
2 node RAC
هل كانت مفيدة؟

المحلول

إنه علة: 7306422

كتب باكل باوتر:http://pbarut.blogspot.com/2009/04/caution-for-loop-and-continue-in-oracle.html.

الحل البديل: SQL> تغيير جلسة مجموعة plsql_optimize_level = 1؛

التحيات، روب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top