0

dbms_jobsを使用していくつかのプロシージャを並行して実行しようとしていますが、実行に問題があります。以下のコードを実行しようとすると、このエラーが発生します

20:28:16 Info: Job #16 could not be executed. ORA-12011: execution of 1 jobs failed 
ORA-06512: at "SYS.DBMS_IJOB", line 469 
ORA-06512: at "SYS.DBMS_JOB", line 282 
ORA-06512: at line 1 

declare 
  ln_dummy number; 
  p_stdate CONSTANT DATE := '01-MAY-2012'; 
  p_edate  CONSTANT DATE := '31-MAY-2012'; 
  p_cdate CONSTANT DATE := '09-FEB-2013'; 
  p_key CONSTANT INTEGER:= 0; 
  p_ercode  INTEGER; 
  p_erdesc  VARCHAR2(200); 
begin 
  COMMIT; 
  DBMS_JOB.SUBMIT(ln_dummy,'MY_PROC_1('''|| p_stdate ||''','''|| p_edate ||''','''|| p_cdate||''','''|| p_key ||''', :p_ercode, :p_erdesc: );'); 
  COMMIT; 
end; 
/

p_ercodeおよびp_erdescは、MY_PROC_1のoutパラメーターです。コメントアウトしようとすると、ジョブは問題なく実行されます。

私の質問は、MY_PROC_1のp_ercodeとp_erdescをコメントアウトせずにジョブを実行するにはどうすればよいですか。

また、どのジョブが実行されており、どのジョブがすでに実行されているかを知る方法はありますか?アラートのようなものですか?

4

2 に答える 2

3

たぶん、これはうまくいくでしょうか?

declare 
  ln_dummy number; 
  p_stdate CONSTANT DATE := '01-MAY-2012'; 
  p_edate  CONSTANT DATE := '31-MAY-2012'; 
  p_cdate CONSTANT DATE := '09-FEB-2013'; 
  p_key CONSTANT INTEGER:= 0; 
begin 
  COMMIT; 
  DBMS_JOB.SUBMIT(ln_dummy,'
    declare 
      p_ercode  INTEGER; 
      p_erdesc  VARCHAR2(200); 
    begin
      MY_PROC_1('''|| p_stdate ||''','''|| p_edate ||''','''|| p_cdate||''','''|| p_key ||''', p_ercode, p_erdesc );
    end;
  '); 
  COMMIT; 
end; 
于 2013-02-10T16:42:15.123 に答える
1

出力をログに記録する場合は、テーブルを作成できます。

SQL> create table log_table
  2  (
  3    job_id     number,
  4    start_time date,
  5    end_time   date,
  6    retcode    number,
  7    retstr     varchar2(4000)
  8  )
  9  /

Table created.

次に、ジョブを実行します。少しすっきりさせるためにラッパープロシージャを作成しましたが、必要に応じてこれらすべてをジョブに含めることができます。

SQL> create or replace procedure my_proc_1_job(
  2    p_job    number,
  3    p_stdate date,
  4    p_edate  date,
  5    p_cdate  date,
  6    p_key    integer)
  7  is
  8    v_errcode integer;
  9    v_errdesc varchar2(32767);
 10    v_start_date date;
 11  begin
 12    v_start_date := sysdate;
 13    my_proc_1(p_stdate, p_edate, p_cdate, p_key, v_errcode, v_errdesc);
 14    insert into log_table (job_id, start_time, end_time, retcode, retstr)
 15    values (p_job, v_start_date, sysdate, v_errcode, v_errdesc);
 16    commit;
 17  end;
 18  /

Procedure created.

SQL> declare
  2    ln_dummy number;
  3    p_stdate CONSTANT varchar2(20) := '01-MAY-2012';
  4    p_edate  CONSTANT varchar2(20) := '31-MAY-2012';
  5    p_cdate CONSTANT varchar2(20) := '09-FEB-2013';
  6    p_key CONSTANT INTEGER:= 0;
  7  begin
  8    COMMIT;
  9    DBMS_JOB.SUBMIT(
 10      ln_dummy,
 11       'my_proc_1_job(
 12           JOB, to_date('''|| p_stdate ||''',''DD-MON-YYYY''),
 13           to_date('''|| p_edate ||''',''DD-MON-YYYY''),
 14           to_date('''|| p_cdate ||''',''DD-MON-YYYY''),
 15           ' || p_key || ');');
 16    COMMIT;
 17  end;
 18  /

PL/SQL procedure successfully completed.

SQL> select * from log_table;

    JOB_ID START_TIM END_TIME     RETCODE
---------- --------- --------- ----------
RETSTR
----------------------------------------------------------------------------------------------------
         4 10-FEB-13 10-FEB-13         -1
failure

これで、すべての実行がに記録されLOG_TABLEます。

于 2013-02-10T17:19:45.020 に答える