游标循环和继续语句:意外行为

Posted

技术标签:

【中文标题】游标循环和继续语句:意外行为【英文标题】:cursor loop and continue statement : unexpected behaviour 【发布时间】:2010-11-01 09:59:23 【问题描述】:

由于截止日期的压力,我可能会忽略一些事情。但这种行为让我很吃惊。 看起来好像游标缓存了 100 行,而 continue 语句刷新了缓存 并从新缓存提取的第一条记录开始。

我将其缩小到以下脚本:

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

【问题讨论】:

【参考方案1】:

这是一个错误:7306422

帕维尔·巴鲁特写道: http://pbarut.blogspot.com/2009/04/caution-for-loop-and-continue-in-oracle.html

解决方法: SQL> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 1;

问候, 抢

【讨论】:

以上是关于游标循环和继续语句:意外行为的主要内容,如果未能解决你的问题,请参考以下文章

(PLS-00103:在简单声明游标语句和循环选择数据期间遇到符号“;”)

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常

sql 循环语句几种方式(变量循环,游标循环,事务)

PL/SQL控制语句(循环控制语句)

数据库错题库第八章8.5(使用游标的语句一般是循环结构)

7.6.1 continue 语句