【问题标题】: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