【问题标题】:Loop in SQL oracle, show DBMS_OUTPUT.PUT_LINE before completing the execution在 SQL oracle 中循环,在完成执行之前显示 DBMS_OUTPUT.PUT_LINE
【发布时间】:2022-01-14 16:50:08
【问题描述】:

我在动态 oracle sql 语句中有一个 for 循环:

begin
for i in (select x from index_list) loop

-- do stuff with i.x

dmbs_output.put_line('I completed item '||i.x||' of the loop');

end loop;
end;
/

但是 dmbs_output.put_line 中的消息只有在所有循环都完成后才会显示。有没有办法在每轮循环执行时显示它们?

【问题讨论】:

  • 据我所知,唯一的方法是将消息插入到表格中,首选AUTONOMOUS_TRANSACTION

标签: sql oracle loops dbms-output


【解决方案1】:

dbms_output 根本不写入输出设备(屏幕)。作为服务器端进程,它无法访问客户端的显示设备。相反,它写入内部缓冲区。该缓冲区仅在客户端调用的进程完成时返回给客户端(可供客户端使用),此时处理控制权被传递回调用客户端。所以,不,您不会看到结果,而过程控制仍然属于 pl/sql 过程 - 整个过程,而不仅仅是循环。

即便如此,如何处理该缓冲区仍取决于客户端。在 sqlplus 中,我们使用“set serveroutput on”命令指示它显示缓冲区内容。其他客户端可能有其他方法来指导它处理消息缓冲区。还有一些客户根本没有办法,干脆忽略它。

【讨论】:

    【解决方案2】:

    检查您的开发工具(PL/SQL Developer、SQL Developer、Toad 等)以了解如何使用 PL/SQL 调试器。

    其他选项是

    1. 使用dbms_application_info 设置会话的当前模块、操作和客户端信息的值。然后通过查询 v$session 可以从其他会话中看到这些。
    2. 将消息记录到表或文件中。
      • 如果写入表,则需要提交每个条目,如果有其他事务不想在每次循环迭代中提交,则使用自治事务。
      • 如果写入文件,您可以考虑在文件上定义一个外部表以使内容可查询。
    3. 将其编写为流水线函数并进行查询,以便输出一次显示一行作为查询结果。
    4. 理论上,您可以使用 HTTP 接口并在网页上跟踪结果。我没有尝试过,所以不确定它是否实用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多