我在问这个问题之前一直在搜索互联网,但我还没有找到答案。简短的问题 - 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;
答案 0 :(得分:3)
每个工作都在自己的会议中独立运行;你的控制台只会监听会话的输出,所以你的工作只是在虚空中说话,它的输出缓冲区在被写入任何地方之前就被清除了。
由于DBMS_OUTPUT仅用作非常基本的调试输出生成器,因此这不是问题。如果您想实时查看工作进度,可以考虑以下两个选项:
将日志条目插入自定义表(可能使用自治事务提交) - 或者甚至更好,使用现有的日志记录框架,如Logger。
使用DBMS_APPLICATION_INFO更新会话(例如,使用set_action
或set_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