2013-02-10 4 views
0

dbms_jobs를 사용하여 일부 프로 시저를 병렬로 실행하려고하는데 일부 문제가 있습니다. 이하의 코드를 실행하려고 할 때이 오류를out 매개 변수로 dbms_job을 설정하는 방법

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의 출력 매개 변수입니다. 내가 코멘트를하려고하면 문제없이 문제가 해결됩니다.

제 질문은 어떻게 MY_PROC_1에서 p_ercode와 p_erdesc를 주석 처리하지 않고 작업을 실행할 수 있는지입니다.

또한 어떤 작업이 실행되고 있고 어떤 작업이 이미 수행되고 있는지 알 수있는 방법이 있습니까? 경고 같은 것이 있습니까?

+0

이러한 매개 변수는 어디로 반환됩니까? proc. 작업이 실제로 실행될 때 submit_job을 호출하는 것은 오랫동안 사라질 것입니다. – Mat

+0

안녕하세요, 귀하의 회신에 감사드립니다. 나는 좀 새로운 plsql입니다. 의견 있으십니까? – user2058738

+0

사용 가능한 매개 변수로 무엇을하고 싶은지 설명하십시오. 일단 그렇게하면 자신이해야 할 일을 파악할 수 있어야합니다. – Mat

답변

2

어쩌면 작동할까요?

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; 
+0

굉장해! 이것이 가능하다는 것을 몰랐다. 고맙습니다. 이것은 나를 위해 일했다! :) – user2058738

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에 기록됩니다.

+0

대단히 감사합니다. 확실히 그것을 시험해 볼 것입니다. 당분간, Egor의 대답이 나를 위해 일했습니다. – user2058738

관련 문제