关于FETCH BULK COLLECT循环终止逻辑的技术问询
FETCH BULK COLLECT循环终止机制详解
核心结论
你对fname.count = 0触发循环退出的猜测完全正确,下面详细拆解背后的逻辑:
BULK COLLECT的取数行为
- 当游标打开后,第一次执行
fetch exp_cur bulk collect into fname时,因为没有指定LIMIT子句,PL/SQL引擎会一次性读取游标结果集中的所有剩余行(这里就是全部107条员工记录),同时将游标指针直接移动到结果集的末尾。此时fname集合的count值为107。 - 进入第二次循环迭代时,再次执行
fetch exp_cur bulk collect into fname:此时游标已经没有剩余行可以读取,PL/SQL引擎会清空目标集合fname,导致fname.count变为0。 - 这时
exit when fname.count = 0的条件满足,循环直接终止。
补充:与%NOTFOUND的关联
- 当BULK COLLECT未读取到任何行时,
exp_cur%NOTFOUND会返回TRUE,同时目标集合会被清空(count=0),两者是同步触发的。 - 若你的代码添加了
LIMIT限制(比如fetch exp_cur bulk collect into fname LIMIT 50),最后一次取数可能只读取到部分行(比如最后7行),此时fname.count不为0,exp_cur%NOTFOUND也不会返回TRUE;只有当后续再次执行取数操作、无行可取时,才会清空集合,count=0且%NOTFOUND为TRUE。
你的测试代码验证
你的代码未指定LIMIT,所以第一次取数就耗尽了游标所有行;第二次取数时无数据可拿,集合被清空,count=0触发退出逻辑,这完全符合PL/SQL引擎对BULK COLLECT的处理规则。
内容的提问来源于stack exchange,提问作者STAN93
相关产品推荐
相关产品推荐

