【问题标题】:PL/SQL - retrieve outputPL/SQL - 检索输出
【发布时间】:2019-09-16 08:49:01
【问题描述】:

有没有办法从 PL/SQL 连续检索输出,而不是等到 SP 完成执行。连续意味着当它立即执行时。 还有其他检索 pl/sql 输出的机制吗?

根据 Oracle 文档

您使用 PUT 或 PUT_LINE 创建的输出缓冲在 SGA 中。在缓冲输出的 PL/SQL 程序单元返回其调用者之前,无法检索输出。因此,例如,企业管理器或 SQL*Plus 在 PL/SQL 程序完成之前不会显示 DBMS_OUTPUT 消息。

【问题讨论】:

    标签: oracle plsql dbms-output


    【解决方案1】:

    据我所知,有一种方法,但不是DBMS_OUTPUT.PUT_LINE技术我使用的是:

    • 创建一个log 表,该表将接受您通常使用DBMS_OUTPUT.PUT_LINE 显示的值。我使用的列是
      • ID(一个序列,能够对数据进行排序)
      • 日期(了解发生的时间;可能不足以用于排序目的,因为需要很短时间才能完成的操作可能具有相同的时间戳)
      • 消息(VARCHAR2 列,大到足以接受全部信息)
    • 创建一个将值插入该表的记录过程。它应该是一个自治事务,这样您就可以在其中COMMIT(并且能够从其他会话访问数据),而不会影响主事务

    这样做,你会

    • 启动您的 PL/SQL 过程
    • 在适当的时候调用日志记录过程(基本上,你应该在哪里调用DBMS_OUTPUT.PUT_LINE
    • 在另一个会话中,定期查询日志表为select * from log_table order by ID desc

    此外,您可以编写一个简单的 Apex 应用程序,其中包含一个报告页面,该页面从日志记录表中选择并定期刷新(例如,每 10 秒左右)并查看主 PL/SQL 过程的执行情况。

    【讨论】:

      【解决方案2】:

      Littlefoot 提供的方法也是我通常使用的方法。

      但是,您可以针对特定用例尝试另一种方法。假设您有一个长时间运行的批处理作业(例如工资核算流程)。您不希望被束缚在监控进度的屏幕前。但是您想在任何数据行的处理遇到错误时立即知道,以便您可以采取行动或通知相关团队。在这种情况下,您可以添加代码以在处理行遇到错误(或满足您指定的任何条件)时立即发送包含数据库中所有信息的电子邮件。

      您可以使用“UTL_MAIL”包中提供的函数和过程来完成此操作。 UTL_MAIL Documentation from Oracle

      【讨论】:

        【解决方案3】:

        用于监控进度而无需记录到表和自主事务的开销。我用:

        DBMS_APPLICATION.SET_CLIENT_INFO( TO_CHAR(SYSDATE, 'HH24:MI:SS') || ' On step A' );

        然后在 v$session.client_info 中监视您的会话。这一切都在内存中,当然不会持续存在,但它是一种快速简单的〜零成本发布进度的方式。

        用于集中式日志记录的另一个选项 (Linux/UNIX) 是持久的,并且再次避免登录到我喜欢的更普遍可见的数据库中,它是与 syslog 的接口,并让 Splunk 或类似的工具来选择这些。如果您有 Splunk 或类似软件,则无需直接连接到数据库查询即可查看监控。有关如何执行此操作,请参见此处的这篇文章。

        https://community.oracle.com/thread/2343125

        【讨论】:

          猜你喜欢
          • 2018-07-08
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 2015-02-24
          • 1970-01-01
          • 2012-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多