2010-11-08 32 views
5

我想要一个代码示例。如何使用Oracle存储过程编写无限循环?

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

+1

你试图实现什么?听起来没有什么意义,因为你试图避免在存储过程中出现无限循环。 – 2010-11-08 14:15:09

+0

我确实得到了输出:'0 1 2 3 4 5 6 7 8 9 10 var is null' – Quassnoi 2010-11-08 14:18:40

+2

Jay S的评论在这里几乎肯定是正确的 - 您需要在调用PL/SQL块之前启用serveroutput。 – 2010-11-08 14:38:21

回答

11

没有EXIT语句一个循环产生的PL无限循环单程/ SQL

BEGIN 
    LOOP 
    null; 
    END LOOP; 
END; 

你可以也写WHILE循环永不结束

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

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

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

如果你的问题是你没有得到输出,那么你可能没有e nabled DBMS OUTPUT呢。你可以做到这一点:

set serveroutput on 
+0

带有无限循环的'DBMS_OUTPUT'是不合逻辑的。除非命令(查询,匿名块,DDL,您试图运行的任何“单元”)完成,否则Oracle不会将任何输出返回给客户端,因此无论您是否使用无限循环都无法输出输出启用它与否。 – jpmc26 2017-06-24 04:04:01

3

含有一个DBMS_OUTPUT.PUT_LINE循环不会是无限的(如果启用SERVEROUTPUT)的,最终,它会充满整个输出缓冲区或可用内存。以前的限制大约是100万字节,所以会很快被打中。如果它填满了整个计算机内存,那可能需要相当长的一段时间。

在无限循环上,我经历了一个糟糕的补丁,忘记去表中的下一个元素。

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终止。