我想要一个可以运行的查询来查找特定 Oracle 作业上次运行的状态。考虑下面的过程,然后使用
dbms_job.submit
命令调用。
CREATE OR REPLACE PROCEDURE USER1.fake_do_mv_refresh (
p_sleep_secs int,
p_user VARCHAR2,
p_cm_r_pm VARCHAR2 DEFAULT 'CM'
)
AS
fake_error EXCEPTION;
BEGIN
DBMS_LOCK.SLEEP(p_sleep_secs);
raise fake_error;
--INSERT INTO FDS_APPS.MSG VALUES (p_cm_r_pm, current_timestamp);
--commit;
END fake_do_mv_refresh;
/
---------------------------------------------------
--Call the above procedure with dbms_job.submit
---------------------------------------------------
DECLARE
l_jobid int := -1;
l_what varchar2(1000) := 'ok';
p_user varchar(10) := 'USER1';
p_cm_r_pm varchar(2) := 'CM';
p_sleep_secs int := 60;
BEGIN
l_what := 'USER1.fake_Do_mv_refresh(' || p_sleep_secs || ',''' || p_user || ''',''' || p_cm_r_pm || ''');';
dbms_output.put_line(l_what);
dbms_job.submit(job => l_jobid, what => l_what);
dbms_output.put_line(l_jobid);
COMMIT;
END;
-- Try to Find the job
select * FROM DBA_SCHEDULER_RUNNING_JOBS -- Shows the job while it is running
select * FROM DBA_JOBS; --The "WHAT" column is useful in locating a particular job but this view, too, only seems to returns the job while it is running!
select * FROM all_scheduler_job_run_details order by log_date desc; --This view shows the job but with not column that contains identifiable info like the WHAT column above
令我惊讶的是,all_scheduler_job_run_details 视图没有为我提供更多信息来识别已提交的作业,而且它提供的内容,我无法关联到另一个表,例如 DBA_JOBS 表,该表确实有一个有用的 WHAT 列,但是后一个视图似乎只显示正在运行的作业...
关于如何编写 SQL 来获取此类型最后提交的作业的状态有什么建议吗?
当您使用
dbms_job
创建旧作业而不是使用更新、更好的替代品 dbms_scheduler
时,Oracle 实际上会创建一个新的调度程序作业,您可以通过旧作业 dbms_job
作为一种包装器来控制该作业。调度程序中使用的实际作业名称 (dba_scheduler_jobs
) 是使用旧版 job
(来自 dba_jobs
)进行系统命名的。
我建议不要再使用
dbms_job
来做任何事情。使用 dbms_scheduler
创建您的作业,以便您可以给它们起好名字并更轻松地使用它们,并具有新引擎提供的所有灵活性。