为什么PL/SQL游标代码中输出会输出两次

问题描述 投票:0回答:1

想知道为什么下面的代码会输出“hello”两次? (当只有1条输出线时) 谢谢。

DECLARE
cursor c is
Select 'hello' from dual;

word varchar2(100);

BEGIN

open c;
   loop
   fetch c into word;
   dbms_output.put_line(word);
   exit when c%notfound;
   end loop;

END;
sql plsql
1个回答
0
投票

将“EXIT”放在 FETCH 之后。该循环将进行 2 次迭代。第一个获取记录,第二个没有找到记录,但仍然具有第一次迭代的值并打印该值,然后退出。您的代码执行以下操作:

DECLARE
   l_loopcounter NUMBER := 1;
   CURSOR c IS
   SELECT 'hello'
     FROM dual;

   word VARCHAR2(100);
BEGIN
   OPEN c;
   LOOP
      FETCH c INTO word;
      dbms_output.put_line(l_loopcounter || '-' || word);
      l_loopcounter := l_loopcounter + 1;
      EXIT WHEN c%notfound;
   END LOOP;

END;
/


1-hello
2-hello


PL/SQL procedure successfully completed.

将 EXIT 语句移至 FETCH 语句之后:

DECLARE
   l_loopcounter NUMBER := 1;
   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(l_loopcounter || '-' || word);
      l_loopcounter := l_loopcounter + 1;
   END LOOP;

END;
/
1-hello


PL/SQL procedure successfully completed.
© www.soinside.com 2019 - 2024. All rights reserved.