bulk collect %found取不到值

刚才提问了一遍,居然给我划分到‘百度知道 > 教育/科学 > 外语学习 > 英语考试’这里面去了。
code:
declare
TYPE plist IS TABLE OF test_table%ROWTYPE INDEX BY BINARY_INTEGER;
reslist_ plist;
CURSOR getAll IS
SELECT * FROM test_table;
begin
OPEN getAll;
FETCH getAll BULK COLLECT INTO reslist_;
IF getAll%FOUND THEN --
..... --test_table表中有数据,为什么这里的不执行
END IF;
CLOSE getAll;
END;

数据库是Oracle 11g
顺便回答下bulk collect 能提高效率的具体原理。
刚才看了下楼下的两位的答案,可能没有明白我的意思。

我想问的是,表test_table有数据,游标getAll可以取到值,然后存到reslist_里面
即此时getAll%rowcount是大于1的,但是为什么getAll%found为false。

没有回答问题的呢,再加30分。
最新回答
浅夏忆梦

2024-11-27 07:40:13

你写的有点小问题,应该这样,就可以了。
OPEN getAll;
LOOP
FETCH getAll BULK COLLECT INTO reslist_;
EXIT WHEN getAll%NOTFOUND;
END LOOP;
CLOSE getAll;

采用bulkcollect可以将查询结果一次性地加载到collections中,而不是通过cursor一条一条地处理。 Collect批查询在某种程度上可以提高查询效率,它首先将所需数据读入内存,然后再统计分析,这样就可以提高查询效率。这样就需要占用大量内存空间,如果Oracle数据库的内存较小,就不要使用这种方法了。
末暧

2024-11-27 07:49:33

IF getAll%FOUND 这个的返回结果是flase,当然不会执行。bulk collect只执行一次,把所有的游标记录查询出来插入到表中。
Collect批查询在某种程度上可以提高查询效率,它首先将所需数据读入内存,然后再统计分析,这样就可以提高查询效率。但是,如果Oracle数据库的内存较小,Shared
Pool Size不足以保存Bulk Collect批查询结果,那么该方法需要将Bulk Collect的集合结果保存在磁盘上,在这种情况下,Bulk
Collect方法的效率反而不如其他两种方法,有兴趣的读者可以进一步测试。
想你想的,我骨头痛。

2024-11-27 07:13:51

前面的几位说法有点错误。
退出循环,判断BULK COLLECT 是否存在数据不能用游标的属性去判断,应该用BULK COLLECT 的属性去判断。(这个你测试下就知道了)
提高效率的原理是因为,BULK COLLECT 可以减少PL/SQL引擎与SQL引擎的上下文切换,可以进行批删,批改。
独我暖阳

2024-11-27 07:37:12

FETCH getAll BULK COLLECT INTO reslist_; 数据已经全部被你加载了,游标已经到尽头了,当然是false.

正确写法
open cur;
loop

fetch cur bulk collect into lv_xxx limit 5000;

forall x in 1..lv_xxx.count

dml;

exit when cur%notfound or cur%notfound is null;

end loop;

close cur;