【问题标题】:DBMS scheduler oracle - how to execute a procedureDBMS 调度程序 oracle - 如何执行过程
【发布时间】:2021-09-29 18:12:01
【问题描述】:

我疯了。我有一个名为 foo() 的过程,它不接受任何参数。我想每 3 分钟执行一次。我写的代码如下:

BEGIN
    dbms_scheduler.create_job(job_name => FooJob,
                                  job_type => 'PLSQL_BLOCK',
                                  job_action => '
                                                 BEGIN 
                                                  foo();
                                                  END;',
                                  start_date => SYSTIMESTAMP,
                                  repeat_interval => 'FREQ=MINUTELY;INTERVAL=3;BYHOUR=17;BYMINUTE=35;',
                                  enabled => TRUE
                                  comments => 'A comment.');
END;
/

这给了我一个错误:应定义标识符“applyjobpenalities”。

我基于这个例子:How to execute a procedure with DBMS_SCHEDULER.CREATE_JOB procedure

还有:

1) foo(); 执行后如何执行dbms_output.put_line()?是否可以直接把这条线放在一边?

2) 如何检查程序foo() 是否代表调度程序执行?

更新: 好的,我所做的是:

1) 我输入了 SQL Plus 'set serveroutput on'

2)我做了一个程序:

create or replace procedure proc1
IS
BEGIN
dbms_output.put_line('sth');
end;
/

3) 我将调度程序代码更改为:

BEGIN
dbms_scheduler.create_job(  job_name    => 'JustATest',
                                job_type    => 'PLSQL_BLOCK',
                                job_action  => 
                                                    'BEGIN 
                                                    proc1();
                                                    END;',
                                start_date  => systimestamp + interval '10' second,
                                repeat_interval => 'FREQ=SECONDLY',
                                enabled     => TRUE);
END;
/

但我在 SQL Plus 中看不到任何结果。我错过了什么?两个程序都编译成功,我可以在输入时看到这个作业:

SELECT * FROM DBA_SCHEDULER_JOBS;

【问题讨论】:

  • 阅读文档 - docs.oracle.com/cd/B28359_01/server.111/b28310/… 请显示完整的错误堆栈跟踪。您无法从后台作业“看到” dbms_output。
  • proc1 正在后台运行。您看不到 dbms_output 的输出。不知道如何使它更清楚。如果需要,写入日志表。
  • 我明白了,谢谢。但是,如果我使用其他更新数据的程序,我看不到它实际运行。那怎么了?

标签: oracle scheduler


【解决方案1】:

1) 无法从计划作业中提取 DBMS_OUTPUT。

2) 要检查 FOO 是否正在执行,我使用以下 SQL(从 TOAD 的“Spool SQL to Screen”选项中提取。如果您打算花任何时间在 Oracle 中进行开发,请获取 TOAD for Oracle)。

  SELECT l.job_name
  , l.JOB_SUBNAME
       , l.log_id "Log ID"
       , l.log_date "Log Date"
       , l.operation "Operation"
       , l.status "Status"
       , l.user_name "User Name"
       , l.client_id "Client ID"
       , l.global_uid "Global UID"
       , r.req_start_date "Required Start Date"
       , r.actual_start_date "Actual Start Date"
       , r.run_duration "Run Duration"
       , r.instance_id "Instance ID"
       , r.session_id "Session ID"
       , r.slave_pid "Slave PID"
       , TO_CHAR (r.cpu_used) "CPU Used"
       , r.additional_info "Additional Info (Run)"
    FROM dba_scheduler_job_log l, dba_scheduler_job_run_details r
   WHERE l.log_id = r.log_id(+)
   and l.job_name like 'FooJob'
ORDER BY 1 DESC NULLS LAST;

2b) 查看当前正在运行的作业:

 SELECT *
  FROM dba_scheduler_running_jobs;

3) 如果你想看到你的工作的结果,你需要让你的工作做一些事情,比如在表格中插入一条记录。

【讨论】:

  • 所以不可能看到我在上面的编辑部分发布的执行过程的通知?
  • 是的,这是不可能的。如果需要,写入表。
  • 很好。我用执行一系列选择/更新操作的过程更改了此过程,现在当我执行此过程并从您的帖子的 2b) 中键入 select 时,我看到结果“没有选择的行”。我做错了什么?
  • 可能是作业运行并完成。也可能是作业调度程序未运行。要查看作业是否排队,请执行“select * from SYS.DBA_SCHEDULER_JOBS”。要查看作业历史记录,请执行“SELECT * FROM SYS.DBA_SCHEDULER_JOB_LOG”。如果这些已作为登录者排队,请用“USER”替换“DBA”。
【解决方案2】:

更改Job_action => 'proc1';

在另一个记事本中输入

    BEGIN
    DBMS_SCHEDULER.RUN_JOB(
    JOB_NAME            => 'justATest',
    USE_CURRENT_SESSION => FALSE);
    END;

然后执行上面的代码

【讨论】:

    【解决方案3】:

    您可以在 dba_scheduler_job_run_details 列“输出”中看到 dbms_output.put_line() 的结果。 投入工作

    BEGIN 
      foo();
      dbms_output.put_line( 'foo executed in job' ) ;
    END;
    

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2023-04-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2010-12-23
      • 2013-09-02
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多