【问题标题】:DBMS_SCHEDULER.CREATE JOB does not working with DBMS_OUTPUT.PUT_LINE?DBMS_SCHEDULER.CREATE JOB 不适用于 DBMS_OUTPUT.PUT_LINE?
【发布时间】:2017-10-02 19:58:06
【问题描述】:

在问这个问题之前我一直在搜索一些互联网,但我没有找到答案。简短的问题 - 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;

【问题讨论】:

  • 嗨,每个作业都意味着oracle db中的一个会话,每个会话都有自己的输出缓冲区(控制台),所以你的问题是捕获会话然后获取它的输出缓冲区

标签: plsql plsqldeveloper


【解决方案1】:

每个作业都在自己的会话中运行,与您的会话分开;你的控制台只会监听你会话的输出,所以你的工作只是对着虚空说话,它的输出缓冲区在被写入任何地方之前被清除。

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

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

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

【讨论】:

  • 你是对的 Jefferey - 当我在 USER_SCHEDULER_JOB_RUN_DETAILS 上选择我的工作名称时,列 SESSION_ID 的每一行都有不同的值。我虽然,我的情况很简单 - 很简单,就像我最初问题中的代码一样,但生活表明事实并非如此......谢谢你的帮助:)
【解决方案2】:

在 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

【讨论】:

    猜你喜欢
    • 2018-04-22
    • 2023-03-09
    • 1970-01-01
    • 2018-09-23
    • 2012-05-13
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多