Plsql 如何在没有参数的情况下设置dbms_作业

Plsql 如何在没有参数的情况下设置dbms_作业,plsql,oracle10g,Plsql,Oracle10g,我试图使用dbms_作业并行运行一些过程,但在执行过程中遇到了一些问题。当试图运行下面的代码时,我遇到了这个错误 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 p_e

我试图使用dbms_作业并行运行一些过程,但在执行过程中遇到了一些问题。当试图运行下面的代码时,我遇到了这个错误

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 

p_ercode和p_erdesc是MY_PROC_1中的一个out参数。如果我试着把它注释掉,作业就会毫无问题地运行

我的问题是如何在不注释我的程序1中的p_ercode和p_erdesc的情况下运行作业

还有,有没有办法知道哪个作业正在运行,哪个作业已经完成?像警报之类的

也许这样行得通

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; 
也许,这样行吗

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; 

如果要记录输出,可以创建一个表:

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\u表中

如果要记录输出,可以创建一个表:

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\u表中

这些输出参数将返回到哪里?程序。当作业实际运行时,调用submit_作业的功能将消失很久。您好,谢谢您的回复。我是plsql的新手。你有什么建议吗?请解释一下,如果你能使用这些参数,你想用它们做什么。一旦您这样做了,您应该能够自己决定要做什么。这两个参数都用于MY_PROC_1在执行时生成错误。它将在这些变量中分配错误代码和错误描述,并将它们插入到日志表中?那么你能做些什么呢?那些out参数将返回到哪里?程序。当作业实际运行时,调用submit_作业的功能将消失很久。您好,谢谢您的回复。我是plsql的新手。你有什么建议吗?请解释一下,如果你能使用这些参数,你想用它们做什么。一旦您这样做了,您应该能够自己决定要做什么。这两个参数都用于MY_PROC_1在执行时生成错误。它将在这些变量中分配错误代码和错误描述,并将它们插入到日志表中?那你能做些什么呢?太棒了!我不知道这是可能的。非常感谢你。这一个帮了我的忙!:)令人惊叹的!我不知道这是可能的。非常感谢你。这一个帮了我的忙!:)非常感谢。我一定要试试看。现在,埃戈尔的回答帮了我的忙。非常感谢。我一定要试试看。现在,埃戈尔的回答对我起了作用。