是否有一种方法可以连续地从PL/SQL检索输出,而不是等到SP完成它的执行。连续表示执行立即执行时的意思。还有其他检索pl/sql输出的机制吗?
根据Oracle文档
使用PUT或PUT_LINE创建的输出将在SGA中缓冲。在将其缓冲的PL/SQL程序单元返回给其调用方之前,无法检索输出。因此,例如,Enterprise或SQL*Plus在PL/SQL程序完成之前不会显示DBMS_OUTPUT消息。
发布于 2019-04-26 20:17:56
据我所知,有一种方法,但不是使用DBMS_OUTPUT.PUT_LINE。我使用的技术是:
DBMS_OUTPUT.PUT_LINE显示的值。我使用的列是VARCHAR2列,足够大以接受整个信息)
COMMIT,而不影响主事务。这样做,你会
DBMS_OUTPUT.PUT_LINE调用放在哪里)select * from log_table order by ID desc。此外,您可以编写一个带有一个报表页的简单Apex应用程序,该页面从日志记录表中选择并定期刷新(例如,每10秒左右),并查看主PL/SQL过程的执行情况。
发布于 2019-04-27 07:07:18
Littlefoot提供的方法也是我通常使用的方法。
然而,还有另一种方法,您可以尝试一个特定的用例。假设您有一个长期运行的批处理作业(例如,薪资流程)。你不希望被绑在屏幕前监控进度。但是,您希望知道任何数据行的处理一旦遇到错误,就可以采取行动或通知相关团队。在这种情况下,您可以添加代码,在处理一行遇到错误(或满足指定的任何条件)时,立即从数据库发送带有所有信息的电子邮件。
您可以使用“UTL_MAIL”包中提供的函数和过程来完成这一任务。来自Oracle的邮件文档
发布于 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://stackoverflow.com/questions/55874379
复制相似问题