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'在'
上设置serveroutput2)我做了一个程序:
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 :(得分: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;
然后执行上面的代码