如何使用out参数设置dbms_job

时间:2013-02-10 12:38:11

标签: plsql oracle10g

我正在尝试使用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的情况下运行作业。

此外,有没有办法知道哪个作业正在运行以及哪个作业已经完成?像警报一样?

2 个答案:

答案 0 :(得分: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; 

答案 1 :(得分: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