运行过程PL / SQL Oracle with Job调用另一个Job

时间:2014-12-29 06:14:08

标签: oracle stored-procedures plsql scheduler jobs

我在作业Oracle中运行过程X时遇到了困难。在程序X中,它也在调用每个工作。

这是我的代码(RUNNING JOB):

DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => X 
   ,what      => 'begin
ss_run_all_jobs3;
end;'
   ,next_date => to_date('01/01/4000 00:00:00','dd/mm/yyyy hh24:mi:ss')
   ,interval  => 'SYSDATE+2.5/1440 '
   ,no_parse  => FALSE
  );
  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));
  SYS.DBMS_JOB.BROKEN
   (job    => X,
    broken => TRUE);
COMMIT;
END;
/

程序SS_RUN_ALL_JOBS3;

/*other script ... */
BEGIN ss_print_all; END;
/*other script ... */ 

PROCEDURE ss_print_all

CREATE OR REPLACE PROCEDURE SEAT.ss_print_all
IS
 l_jobno pls_integer;
BEGIN
    dbms_job.submit(l_jobno, 'begin ss_print_1; end;' ,sysdate);
    dbms_job.submit(l_jobno, 'begin ss_print_2; end;' ,sysdate);
     dbms_job.submit(l_jobno, 'begin ss_print_3; end;' ,sysdate);
     dbms_job.run(l_jobno);
END;

/

示例ss_print_1的每个程序

  vname := 'RUNPRINT_SEATFRONT';--||vcounter;
--DBMS_SCHEDULER.drop_job(vname);
dbms_scheduler.drop_job (vname);
dbms_scheduler.create_job( 
job_name => vname,
job_type => 'EXECUTABLE',
job_action => 'C:\Windows\System32\cmd.exe',
job_class => 'DEFAULT_JOB_CLASS',
--comments => 'test job',
auto_drop => false,
number_of_arguments => 3,
enabled => FALSE);
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 1, argument_value => '/q'); 
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 2, argument_value => '/c'); 
dbms_scheduler.set_job_argument_value( job_name => vname, argument_position => 3, argument_value => '"'||xxx.txt||'"'); 
dbms_scheduler.enable( vname);

如果在pl / sql编辑器(TOAD编辑器)中运行它运行良好,但如果使用作业(第一个代码)运行则会导致错误

    13:12:05 Info: Job #442 could not be executed.  ORA-12011: execution of 1 jobs failed
ORA-06512: at "SYS.DBMS_IJOB", line 651
ORA-06512: at "SYS.DBMS_JOB", line 284
ORA-06512: at line 1

是因为第一份工作还在处理吗?

谢谢..

1 个答案:

答案 0 :(得分:0)

警报日志将为您提供有关ORA-12011原因的更多信息。您可能需要DBA来帮助您完成这一点,具体取决于您的组织运行方式。

一些额外的观察。

因为10g DBMS_SCHEDULER取代了DBMS_JOB;保留DBMS_JOB是为了与现有应用程序向后兼容,但任何新的应该使用Scheduler,因为它具有更多更好的功能。

你的代码混合了DBMS_JOB和DBMS_SCHEDULER,这是一个坏主意。选择一个(即调度程序)并坚持下去。

此外,您的SUBMIT代码的下一个日期为&01; 01/01/4000 00:00:00' 。新年的第4000天距离很远,所以the job won't run for almost 2000 years,然后每150秒。我很佩服你对应用程序寿命的信心,但也许你应该先尝试让它在更紧迫的时间框架内运行。

虽然当你立刻打破工作时,也许你不关心它是否会运行。