求高人解释下面这个执行情况

zekorr 2011-11-24 05:43:40
DECLARE
TYPE t_oo IS TABLE OF dba_objects.owner%TYPE;
TYPE t_on IS TABLE OF dba_objects.object_name%TYPE;
l_oo t_oo;
l_on t_on;
tcount number(3) := 0;
CURSOR c1
IS
SELECT owner, object_name
FROM dba_objects
WHERE ROWNUM <=1000;
BEGIN
OPEN c1;
LOOP

FETCH c1
BULK COLLECT INTO l_oo, l_on LIMIT 10000;
EXIT WHEN c1%NOTFOUND;
tcount := tcount +1 ;
END LOOP;
CLOSE c1;
dbms_output.put_line(tcount);
END;
/

0

PL/SQL 过程已成功完成。


按道理应该出来的结果是1啊,为什么是0啊?
...全文
131 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenChiM888 2011-11-25
  • 打赏
  • 举报
回复
错~,你把楼主的sql中的10000改成 100你试试看。。

[Quote=引用 9 楼 luiseradl 的回复:]
BULK COLLECT可以做为费时的DML语句的替代,可以在一次操作中返回整个结果集。
所以根据不会对%NOTFOUND进行赋值,所以从%NOTFOUND无法判断已经到达记录的末尾。
[/Quote]
我心飞翔 2011-11-25
  • 打赏
  • 举报
回复
BULK COLLECT可以做为费时的DML语句的替代,可以在一次操作中返回整个结果集。
所以根据不会对%NOTFOUND进行赋值,所以从%NOTFOUND无法判断已经到达记录的末尾。
BenChiM888 2011-11-25
  • 打赏
  • 举报
回复
因为你查询结果根本就不足10000条记录。
你把1000改成100 再用我4楼的代码测试,你就明白了。

[Quote=引用 5 楼 zekorr 的回复:]
为什么第一次循环时执行EXIT WHEN c1%NOTFOUND就退出了啊
[/Quote]
cosio 2011-11-25
  • 打赏
  • 举报
回复
FETCH c1
BULK COLLECT INTO l_oo, l_on LIMIT 1000;

改为:

FETCH c1
INTO l_oo, l_on LIMIT 1000;

来测试一下看看

cosio 2011-11-25
  • 打赏
  • 举报
回复
SELECT owner, object_name
FROM dba_objects
WHERE ROWNUM <=1000;
--查询出来有没有数据?
zekorr 2011-11-25
  • 打赏
  • 举报
回复
为什么第一次循环时执行EXIT WHEN c1%NOTFOUND就退出了啊
BenChiM888 2011-11-25
  • 打赏
  • 举报
回复

--哥哥你测试一下不就知道了。
DECLARE
TYPE t_oo IS TABLE OF dba_objects.owner%TYPE;
TYPE t_on IS TABLE OF dba_objects.object_name%TYPE;
l_oo t_oo;
l_on t_on;
tcount number(3) := 0;
CURSOR c1
IS
SELECT owner, object_name
FROM dba_objects
WHERE ROWNUM <=1000;
BEGIN
OPEN c1;
LOOP

FETCH c1
BULK COLLECT INTO l_oo, l_on LIMIT 10000;
dbms_output.put_line('aaaaaa!');
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line('bbbbbb!');
tcount := tcount +1 ;
END LOOP;
CLOSE c1;
dbms_output.put_line(tcount);
END;
/



[Quote=引用 3 楼 zekorr 的回复:]
按道理应该执行到了啊,第一次循环的时候,c1%NOTFOUND这个语句应该是FALSE啊,所以应该不会EXIT,应该执行了后面那个加法啊
[/Quote]
zekorr 2011-11-25
  • 打赏
  • 举报
回复
按道理应该执行到了啊,第一次循环的时候,c1%NOTFOUND这个语句应该是FALSE啊,所以应该不会EXIT,应该执行了后面那个加法啊
BenChiM888 2011-11-24
  • 打赏
  • 举报
回复
正解。
[Quote=引用 1 楼 jcback 的回复:]
tcount := tcount +1 ;没执行到

BULK COLLECT INTO l_oo, l_on LIMIT 10000;
tcount := tcount +1 ;
EXIT WHEN c1%NOTFOUND;
[/Quote]
jcback 2011-11-24
  • 打赏
  • 举报
回复
tcount := tcount +1 ;没执行到

BULK COLLECT INTO l_oo, l_on LIMIT 10000;
tcount := tcount +1 ;
EXIT WHEN c1%NOTFOUND;

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧