DBMS_SCHEDULER.CREATE JOB 不适用于 DBMS_OUTPUT.PUT_LINE?

DBMS_SCHEDULER.CREATE JOB does not working with DBMS_OUTPUT.PUT_LINE?

在问这个问题之前,我一直在网上搜索,但没有找到答案。简短的问题 - Oracle 的工作是否与 DBMS_OUTPUT 一起工作?我想在给定的时间间隔内在控制台上写一些文本,但它对我不起作用。例如,我想每 3 秒在控制台上写入一次时间戳。

工作 - 不工作。

工作+程序,也不行。

作业+程序+调度程序,不起作用...

任何人都可以给我一些提示如何获得它吗? :)

我的示例代码:

begin
dbms_scheduler.create_job (
job_name =>        'some_job',
job_type =>        'PLSQL_BLOCK', 
job_action =>      'BEGIN DBMS_OUTPUT.PUT_LINE(SYSTIMESTAMP); END;',
start_date =>       SYSTIMESTAMP,
repeat_interval => 'FREQ=SECONDLY; INTERVAL=3',
end_date =>         NULL,
enabled =>          TRUE,
comments =>        'Example job.');
end;

每项工作 运行 在其自己的会话中,与您的会话分开;您的控制台只会监听您的会话的输出,因此您的工作只是对空说话,其输出缓冲区在写入任何地方之前被清除。

因为 DBMS_OUTPUT 只是一个非常基本的调试输出生成器,所以这不是问题。如果您想实时查看工作进度,可以考虑以下两种选择:

  1. 将日志条目插入自定义 table(可能使用自治事务提交)——或者更好的是,使用现有的日志框架,如 Logger.

  2. 使用 DBMS_APPLICATION_INFO 更新会话(例如使用 set_actionset_session_longops)- 这将允许您仅查看作业的当前状态,但是.

在 Oracle 12c 中,您可以使用一个新功能来准确捕获 DMBS_Output: 所有输出如

dbms_output.put_line('Done'); 

可见

select OUTPUT from DBA_SCHEDULER_JOB_RUN_DETAILS -- or USER_SCHEDULER_JOB_RUN_DETAILS

另见 this excellent article here