【问题标题】:last statement of procedure after for loop is not working in pl sqlfor循环后的最后一个过程语句在pl sql中不起作用
【发布时间】:2023-04-05 11:00:01
【问题描述】:

我创建了以下测试过程,我正在打印调试消息,我发现 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.

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案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
          猜你喜欢
          • 2016-09-27
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 2014-04-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多