首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PL/SQL -检索输出

PL/SQL -检索输出
EN

Stack Overflow用户
提问于 2019-04-26 20:11:49
回答 3查看 297关注 0票数 2

是否有一种方法可以连续地从PL/SQL检索输出,而不是等到SP完成它的执行。连续表示执行立即执行时的意思。还有其他检索pl/sql输出的机制吗?

根据Oracle文档

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

EN

回答 3

Stack Overflow用户

发布于 2019-04-26 20:17:56

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

  • 创建一个日志表,它将接受通常使用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过程的执行情况。

票数 3
EN

Stack Overflow用户

发布于 2019-04-27 07:07:18

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

然而,还有另一种方法,您可以尝试一个特定的用例。假设您有一个长期运行的批处理作业(例如,薪资流程)。你不希望被绑在屏幕前监控进度。但是,您希望知道任何数据行的处理一旦遇到错误,就可以采取行动或通知相关团队。在这种情况下,您可以添加代码,在处理一行遇到错误(或满足指定的任何条件)时,立即从数据库发送带有所有信息的电子邮件。

您可以使用“UTL_MAIL”包中提供的函数和过程来完成这一任务。来自Oracle的邮件文档

票数 3
EN

Stack Overflow用户

发布于 2019-04-27 09:50:57

用于监视进度,而不需要记录到表和独立事务的开销。我用:

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55874379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档