在 oracle 中打印进度
Posted
技术标签:
【中文标题】在 oracle 中打印进度【英文标题】:Print progress in oracle 【发布时间】:2021-08-26 07:47:09 【问题描述】:我有一个“主”过程,它在循环中调用其他过程。我想显示消息,显示程序何时开始以及何时完成,如下所示:
DBMS_OUTPUT.PUT_LINE('LOOP 1 STARTED');
DBMS_OUTPUT.PUT_LINE('PROCEDURE 1 STARTED');
PROCEDURE_1(x, y);
DBMS_OUTPUT.PUT_LINE('PROCEDURE 1 COMPLETED');
DBMS_OUTPUT.PUT_LINE('PROCEDURE 2 STARTED');
PROCEDURE_2(x, y);
DBMS_OUTPUT.PUT_LINE('PROCEDURE 2 COMPLETED');
.
.
.
DBMS_OUTPUT.PUT_LINE('LOOP 2 STARTED');
问题在于,这样做只会在所有程序完成后才会显示消息。有没有办法让这些消息“实时”显示?还有什么可以做的吗?
【问题讨论】:
【参考方案1】:dbms_output
只是写入内存缓冲区,在调用完成后客户端应用程序可以访问该缓冲区。所以客户端应用程序在执行完成之前无法显示输出。
最简单的方法通常是使用自治事务将数据写入日志表,然后有一个单独的会话来查询日志表以显示进度。您可以使用dbms_mail
构建替代解决方案,因为这不是事务性的,或者utl_http
进行HTTP 调用以刷新具有当前状态的网页,或者使用dbms_alert
或dbms_aq
包将消息发送到其他组件在系统中。但这通常需要更多的管道来设置。
【讨论】:
Oracle 没有内置的 PL/SQL 日志记录包,但最接近行业标准的是 Tyler Muth 的开源库logger
,即available on GitHub。以上是关于在 oracle 中打印进度的主要内容,如果未能解决你的问题,请参考以下文章
Jupyter Notebook 中的 tqdm 重复打印新的进度条