2016-12-06 420 views
1

我放松了我的想法。我有一个名为foo()的过程,它不带任何参数。我想每3分钟执行一次,比如说。我写的代码如下所示:DBMS调度程序oracle - 如何执行程序

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()是否(正在)代表调度程序执行?

UPDATE: 好了,所以我所做的就是:

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; 
+0

阅读文档 - https://docs.oracle.com/cd/B28359_01/server.111/b28310/schedadmin002.htm#ADMIN12039请显示完整的错误堆栈跟踪。您无法从后台作业中“查看”dbms_output。 – OldProgrammer

+0

proc1正在后台运行。您看不到dbms_output的输出。不知道如何让这个更清楚。如果需要,写入日志表。 – OldProgrammer

+0

我现在明白了,谢谢。但是,如果我使用其他更新数据的过程,我没有看到它实际运行。那怎么了? – monterinio

回答

2

1)没有办法从计划作业提取DBMS_OUTPUT。

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

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)如果你想看到你的工作成果,你需要有你的工作做一些事情,比如插入一条记录放入桌子。

+0

因此,我无法看到执行过程中的通知,因为我上面在编辑部分发布了通知。 – monterinio

+0

是的,这是不可能的。如果需要,写入表格。 – OldProgrammer

+0

好。我改变了这个程序,做了一堆选择/更新操作,现在当我执行这个并从我的帖子的2b)中选择type select时,结果'没有选择行'。我究竟做错了什么? – monterinio