【问题标题】:Why do I see no output from this PL/SQL block?为什么我看不到这个 PL/SQL 块的输出?
【发布时间】:2011-05-06 16:39:50
【问题描述】:

我想要一个代码示例。

我正在尝试这个:

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;

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

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

【问题讨论】:

  • 你想达到什么目的?听起来不是很有意义,因为通常您会尝试避免在存储过程中出现无限循环。
  • 我确实得到了输出:0 1 2 3 4 5 6 7 8 9 10 var is null
  • Jay S 的评论在这里几乎肯定是正确的——您需要在调用 PL/SQL 块之前启用 serveroutput。
  • 听起来您的问题与无限循环无关,只是您认为这可能是您看不到输出的原因。建议将问题的标题更改为更合适的名称,例如“为什么这个 PL/SQL 块不产生输出?”。 Jay S 的回答可能与您的实际问题最相关。
  • 这是两个独立的问题(严重地)合二为一。不生产输出块被消除。 “固定”问题标题也被编辑,因为它忽略了循环问题的有用答案。

标签: sql oracle stored-procedures


【解决方案1】:

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

BEGIN
  LOOP
    null;
  END LOOP;
END;

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

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

【讨论】:

    【解决方案2】:

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

    set serveroutput on
    

    【讨论】:

    • DBMS_OUTPUT 无限循环是不合逻辑的。在命令(查询、匿名块、DDL、您尝试运行的任何“单元”)完成之前,Oracle 不会将任何输出返回给客户端,因此无论您是否使用无限循环都不会给您输出是否启用。
    【解决方案3】:

    包含 DBMS_OUTPUT.PUT_LINE 的循环不会是无限的(如果启用了服务器输出),因为最终它将填满整个输出缓冲区或可用内存。过去的限制大约是 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 终止。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多