在 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_alertdbms_aq 包将消息发送到其他组件在系统中。但这通常需要更多的管道来设置。

【讨论】:

Oracle 没有内置的 PL/SQL 日志记录包,但最接近行业标准的是 Tyler Muth 的开源库logger,即available on GitHub。

以上是关于在 oracle 中打印进度的主要内容,如果未能解决你的问题,请参考以下文章

在命令窗口中打印进度

Jupyter Notebook 中的 tqdm 重复打印新的进度条

python3如何打印进度条

根据从导入包中打印的标准输出更新 PyQt 进度条(PyQt5)

QT之字体进度打印对话框

Python打印进度条