DBMS调度程序oracle - 如何执行过程

时间:2016-12-06 20:46:14

标签: oracle scheduler

我失去了理智。我有一个名为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'在'

上设置serveroutput

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;

2 个答案:

答案 0 :(得分:2)

1)无法从预定作业中提取DBMS_OUTPUT。

2)为了检查FOO是否正在执行,我使用以下SQL(从TOAD' s" 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)如果您想查看工作中的结果,您需要让您的工作做一些事情,例如将记录插入表格。

答案 1 :(得分:0)

更改Job_action => 'proc1';

在另一个记事本中,键入

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

然后执行上面的代码