为什么我看不到此PL / SQL块的输出?

时间:2010-11-08 14:12:11

标签: sql oracle stored-procedures

我想要一个代码示例。

我试试这个:

DECLARE
     var NUMBER;
 BEGIN
     /*N.B. for loop variables in pl/sql are new declarations, with scope only inside the loop */ 
     FOR var IN 0 .. 10 LOOP 
          DBMS_OUTPUT.put_line(var);
     END LOOP;

     IF (var IS NULL) THEN
          DBMS_OUTPUT.put_line('var is null');
     ELSE
          DBMS_OUTPUT.put_line('var is not null');
     END IF;
 END;

并且没有输出(虽然我知道它不是无限循环)。 为什么这个不打印?

编辑:非打印代码是通过数据库管理器界面修复的。

4 个答案:

答案 0 :(得分:12)

没有EXIT语句的LOOP是在PL / SQL中生成无限循环的一种方法

BEGIN
  LOOP
    null;
  END LOOP;
END;

您还可以编写永不结束的WHILE循环

BEGIN
  WHILE( true )
  LOOP
    NULL;
  END LOOP;
END;

答案 1 :(得分:5)

如果您的问题是没有输出,那么您可能还没有启用DBMS OUTPUT。你可以用:

来做到这一点
set serveroutput on

答案 2 :(得分:3)

包含DBMS_OUTPUT.PUT_LINE的循环不会是无限的(如果启用了serveroutput),最终它将填充整个输出缓冲区或可用内存。过去的限制大约是1百万字节,所以会很快受到影响。如果要填满整个计算机内存,可能需要一段时间。

在无限循环中,我经历了一个忘记转到表中下一个元素的坏补丁。

DECLARE
  type typ_tab is table of varchar2(10) index by pls_integer;
  t_tab typ_tab;
  v_ind number;
BEGIN
  t_tab(10) := 'A';
  t_tab(20) := 'B';
  v_ind := t_tab.first;
  WHILE v_ind IS NOT NULL LOOP
    dbms_output.put_line(t_tab(v_ind));
    v_ind := t_tab.next(v_ind); --Forget this and it loops forever
  END LOOP;
END;

一旦他们进入这样的循环,会话可能需要被DBA杀死。

答案 3 :(得分:2)

不知道你为什么需要它,但是:

BEGIN
        WHILE  1 = 1
        LOOP
                NULL;
        END LOOP;
END;