DBMS_SCHEDULER.CREATE JOB不能与DBMS_OUTPUT.PUT_LINE一起使用?

时间:2017-10-02 19:58:07

标签: plsql plsqldeveloper

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

工作 - 不起作用。

工作+计划,也不起作用。

job + program + scheduler,不起作用......

有人能给我一些提示吗? :)

我的示例代码:

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;

2 个答案:

答案 0 :(得分:3)

每个工作都在自己的会议中独立运行;你的控制台只会监听会话的输出,所以你的工作只是在虚空中说话,它的输出缓冲区在被写入任何地方之前就被清除了。

由于DBMS_OUTPUT仅用作非常基本的调试输出生成器,因此这不是问题。如果您想实时查看工作进度,可以考虑以下两个选项:

  1. 将日志条目插入自定义表(可能使用自治事务提交) - 或者甚至更好,使用现有的日志记录框架,如Logger

  2. 使用DBMS_APPLICATION_INFO更新会话(例如,使用set_actionset_session_longops) - 这样,您只能看到作业的当前状态。

答案 1 :(得分:0)

在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