我有许多 pl/sql 过程,可能需要几分钟才能运行。在开发它们时,我添加了一些打印语句来帮助调试,并提供一些反馈和进度指示器。最初,我在小型测试集上运行这些,输出几乎是瞬时的。现在,我正在使用需要几分钟才能运行的较大测试集进行测试,我发现打印到控制台不再合适,因为在过程结束之前不会打印任何内容。我习惯于在不缓冲输出并立即打印它的环境中工作,并且添加简单的打印语句以进行简单的调试和诊断是很常见的。

pl/sql 是否可以立即打印输出(不缓冲)?如果没有,人们推荐什么替代方案来获得类似的结果?

有帮助吗?

解决方案

您可以有使用自治事务类似消息写入表的程序:

procedure log (p_message)
is
    pragma autonomous_transaction;
begin
    insert into message_log (user, datetime, message)
    values (user, sysdate, p_message);
    commit;
end;

然后监视来自另一个Oracle会话表。

其他提示

我们为这个小窍门。

可以使用DBMS_APPLICATION_INFO.set_client_info( “一些信息”); 创造一些变量和更换内部“”的字符串。

和使用select CLIENT_INFO从V $会话监测进展。

我已经使用DBMS_PIPE用于此目的。将消息发送到命名管道,并从另一个会话读取。此方法可能不是在RAC的环境中工作时,写入和读出过程可以连接到不同的节点。

或者,也可以使用在其自己的会话中使用“编译AUTONOMOUS_TRANSACTION”运行一个程序将消息插入的表。可以在查询从另一会话这些消息

编辑:我看到我的第二个选项已经提到

一般有两种选择:

  • 将输出发送到Oracle表(或临时表)
  • 使用 UTL_FILE 写入(数据库主机)文件系统

如果您没有操作系统访问数据库主机的权限,您仍然可以写入 dbhost 文件系统并将 Oracle 外部定义的表绑定到该文件,以便可以使用 SELECT 对其进行查询。

这可能取决于你的客户端工具。我没有使用过的SQL * Plus在一段时间,但是当我在调试PL / SQL开发人员的程序,我打开命令窗口,并发出一个SET SERVEROUTPUT ON命令。然后,当予执行的程序,通过任何印刷DBMS_OUTPUT.PUT_LINE马上显示出来。

编辑:你说得对,我想我只看到,随着更大量的输出之类的东西。无论如何,我做了一些网上搜索和跨此次来到 log4plsql - 可能是有用

另一种方法是使用一个返回日志记录信息的流水线功能。在这里看到的例子: HTTP://berxblog.blogspot。 COM / 2009/01 /流水线功能-VS-dbmsoutput.html 当您使用管道函数,你不必使用其他SQLPLUS /蟾蜍/ SQL开发人员等......会议。

您可以使用DBMS管和管浏览器在PL / SQL Developer来异步捕获所有的相关信息,因为它们被放入管道。

要小心,只把东西放进管道时有一个人读它。否则,当满管您的通话将失败。

还有使用事件的可能性,PL / SQL开发具有事件监视器,以及。和文档应该提供的如何做到这一点的例子。

另一种选择是让你的PL / SQL调用的程序发送一封电子邮件,在它的日志信息。这需要你的数据库的电子邮件发送功能,可使用UTL_SMTP添加。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top