for循环后的最后一个过程语句在pl sql中不起作用

Posted

技术标签:

【中文标题】for循环后的最后一个过程语句在pl sql中不起作用【英文标题】:last statement of procedure after for loop is not working in pl sql 【发布时间】:2015-09-28 10:35:55 【问题描述】:

我创建了以下测试过程,我正在打印调试消息,我发现 for 循环之后的最后一个过程语句不起作用。为什么 ?

在以下情况下,我无法打印第三个 for 循环的调试消息,您可以在处理后找到结果:

CREATE OR REPLACE PROCEDURE TEST_SCRIPT AS 
BEGIN
  DBMS_OUTPUT.enable;

  DBMS_OUTPUT.PUT('-- Before for loop --');

  for rec in (
    SELECT sysdate FROM DUAL
  ) loop
  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- inside for loop --');
  end loop;

  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- after for loop --');

  for rec in (
    SELECT sysdate FROM DUAL
  ) loop
  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- second loop --');
  end loop;

  for rec in (
    SELECT sysdate FROM DUAL
  ) loop
  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- third loop --');
  end loop;


END TEST_SCRIPT;

结果:

-- Before for loop --
-- inside for loop --
-- after for loop --
-- second loop --
Process exited.

【问题讨论】:

【参考方案1】:

尝试使用

DBMS_OUTPUT.PUT_LINE

而不是 DBMS_OUTPUT.PUT

【讨论】:

【参考方案2】:

该输出背后的原因是,DBMS_OUTPUT.PUT 将 line 放在缓冲区中,而您对 DBMS_OUTPUT.NEW_LINE() 的调用返回 line 放在缓冲区中。

所以,这里您的 DBMS_OUTPUT.PUT('-- Before for loop --'); 由您在第一个 for 循环中提到的 DBMS_OUTPUT.NEW_LINE() 调用返回。

同样,其他电话也发生了同样的事情,因为DBMS_OUTPUT.PUT('-- third loop --'); 不存在DBMS_OUTPUT.NEW_LINE() 所以它没有被打印出来。

要打印它,只需在下面更改--

.....

for rec in (
    SELECT sysdate FROM DUAL
  ) loop
  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- third loop --');
  DBMS_OUTPUT.NEW_LINE();
  end loop;
..

【讨论】:

【参考方案3】:

它实际上也在执行第三个循环你需要在DBMS_OUTPUT.PUT('-- third loop --');之后添加DBMS_OUTPUT.NEW_LINE();

【讨论】:

【参考方案4】:

修改你的最后一个循环,如下所示。

  for rec in (
    SELECT sysdate FROM DUAL
  ) loop
  DBMS_OUTPUT.NEW_LINE();
  DBMS_OUTPUT.PUT('-- third loop --');
  DBMS_OUTPUT.NEW_LINE();
  end loop;

原因

在 DBMS_OUTPUT.NEW_LINE() 调用之前,只有数据会显示在放置缓冲区中。

编辑

通过编辑您的代码..

CREATE OR REPLACE PROCEDURE TEST_SCRIPT AS 
BEGIN


  DBMS_OUTPUT.PUT('-- Before for loop --');
  DBMS_OUTPUT.NEW_LINE();
  for rec in (
    SELECT sysdate FROM DUAL
  ) loop

  DBMS_OUTPUT.PUT('-- inside for loop --');
    DBMS_OUTPUT.NEW_LINE();
  end loop;


  DBMS_OUTPUT.PUT('-- after for loop --');
  DBMS_OUTPUT.NEW_LINE();
  for rec in (
    SELECT sysdate FROM DUAL
  ) loop

  DBMS_OUTPUT.PUT('-- second loop --');
    DBMS_OUTPUT.NEW_LINE();
  end loop;

  for rec in (
    SELECT sysdate FROM DUAL
  ) loop

  DBMS_OUTPUT.PUT('-- third loop --');
      DBMS_OUTPUT.NEW_LINE();
  end loop;
END TEST_SCRIPT;

【讨论】:

对于超过一行的游标查询 - 希望 OP 确实有,否则为什么要循环 - 将额外的 new_line 放在循环内会给出空行; 循环之后有一个最后一个会更干净吗?或者将所有循环更改为只有 new_line 在末尾;不清楚是否有理由这样做,而不是使用put_line

以上是关于for循环后的最后一个过程语句在pl sql中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL控制语句(循环控制语句)

Liquid - if contains 语句在 for 循环中不起作用

jQuery if 语句在 for 循环中不起作用

为啥我在 PL/SQL 中的 for 循环没有打印出最后一次迭代

PL/SQL循环查询语句怎么写?

Excel VBA:错误 Goto 语句在 For-Loop 中不起作用