实时 PL/SQL 输出
是否可以实时获得 PL/SQL 的输出?我有一个相当大的包裹,运行了一个多小时,我想看看该包裹在特定时间在哪里。
无论如何,我目前使用一个日志表来执行此操作,每次运行该表都会填充数百个日志描述,我只是好奇这是否可能。
谢谢!
Is it possible to have Outputs from PL/SQL in real time? I have a pretty huge package that runs for more than an hour and I'd like to see where the package is at a particular time.
Anyways, I currently do this with a log table, which gets filled up with hundreds of log descriptions per run, I'm just curious if this is possible.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这就是我使用的东西(输出可以在 v$session 和 v$session_longops 中看到)...
This is the kind of thing I use (output can be seen in v$session and v$session_longops)...
我不知道这是否正是您想要的,但我使用 dbms_application_info.set_module 来查看我的包在哪里。
对
v$session
的查询将显示该过程的哪一部分正在运行。I don't know if this is exactly what you want but I use dbms_application_info.set_module to see where my package is.
A query on
v$session
will show you which part of the procedure is running.您可以使用 自主事务(例如这个SO中建议的)。
这将允许您在日志表中写入和提交,而无需提交主事务。然后,您将能够跟踪主脚本运行时发生的情况(顺便说一句,它还允许您计时/调整批处理)。
you could use autonomous transactions (as suggested in this SO for example).
This would allow you to write and commit in a log table without commiting the main transaction. You would then be able to follow what happens in your main script while it is running (incidentally, it will also allow you to time/tune your batch).
使用 DBMS_PIPE 将消息写入命名管道。在另一个会话中,您可以从管道读取消息。非常简单,就像一个魅力!
Use DBMS_PIPE to write a message to a named pipe. In another session you can read the messages from the pipe. Very simple, works like a charm !
如果您的长时间运行作业正在处理大量大小相当均匀的任务,您可能会发现会话 longops 是监视作业进度的好方法,并且允许您估计作业需要多长时间才能完成。
DBMS_APPLICATION_INFO.set_session_longops
If your long-running job is processing a large number of fairly evenly sized tasks, you may find session longops a good way of monitoring the job progress, as well as allowing you to estimate how long the job will take to finish.
DBMS_APPLICATION_INFO.set_session_longops
如果您可以从 PL/SQL 环境访问 shell,则可以调用 netcat:
BEGIN RUN_SHELL('echo "'||v_msg||'" | nc '||v_host||' '||v_port||' -w 5' );结尾;
/
v_host
是运行 python 脚本的主机,它从端口v_port
上的套接字读取数据。我在为 shell 和 pl/sql 编写 aplogr 时使用了这种设计日志监控。
If you have access to shell from PL/SQL environment you can call netcat:
BEGIN RUN_SHELL('echo "'||v_msg||'" | nc '||v_host||' '||v_port||' -w 5'); END;
/
v_host
is a host running python script that reads data from socket on portv_port
.I used this design when I wrote aplogr for shell and pl/sql logs monitoring.