PL/SQL游标代码为何重复输出两次?请求排查原因
问题原因分析
你的代码逻辑顺序错误,导致重复输出。具体执行流程如下:
- 第一次进入循环:从
dual表中成功获取到唯一一行数据hello并存入word变量,执行dbms_output.put_line(word)输出hello;随后检查c%notfound,此时游标未到末尾,条件不成立,继续循环。 - 第二次进入循环:再次执行
fetch,此时游标已无数据可获取,c%notfound变为true,但你先执行了put_line(word)(输出的仍是上一次保存的hello),之后才触发exit退出循环。
修正后的代码
调整判断与输出的顺序,确保仅在成功获取数据后才输出:
DECLARE cursor c is Select 'hello' from dual; word varchar2(100); BEGIN open c; loop fetch c into word; exit when c%notfound; -- 先判断是否获取失败,失败直接退出 dbms_output.put_line(word); -- 成功获取才输出 end loop; END;
更推荐使用简洁的游标FOR循环(无需手动管理游标开闭与判断):
DECLARE cursor c is Select 'hello' from dual; BEGIN for rec in c loop dbms_output.put_line(rec.column_value); end loop; END;
内容的提问来源于stack exchange,提问作者moon light
相关产品推荐
相关产品推荐

