본문 바로가기
정보관리(데이터베이스, DB)/오라클

JOB_QUEUE_PROCESSES

by 3604 2023. 11. 28.
728x90

출처: https://blog.naver.com/dandywoobin/10041617559

 
일정한 시간 ,일정한 간격으로 반복적으로 수행되어지는 JOB을 JOB QUEUE를 사용하여 스케줄링 할 수 있으며 JOB을 스케줄링 하기 위해서 ORACLE의 DBMS_JOB 패키지를 이용합니다..
이를 위해서는 JOB_QUEUE_PROCESSES 를 설정해야 하는데.... 초기 파라미터를 '0'으로 설정하면
...JOB_QUEUE_PROCESSES 의 시작은 물론 등록된 어떠한 JOB도 실행되질 않습니다... 반드시 유념해 두셔야 겠죠^^
반드시 파라미터의 값을 설정해야 하며  'ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 50' 이렇게 설정할 수 있습니다...


파라미터 값을 정했으면 JOB을 등록 해야겠죠?
DBMS_JOBS의 패키지에 있는 프로시져를 이용하여 쉽게 등록 할 수 있는데...
DBMS_JOB을 이용하여 이처럼 사용하면  특정시간, 특정요일, 특정일, 30초단위, 매분 정각, 매시정각
등 다양하게  잡을 사용할 수 있으며 또한 ETL 을 이용할 때도 유용하게 사용할 수 있습니다.

다음 예를 보시죠^^


DECLARE
    V_JOBID NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(V_JOBID(1),'프로시져 NAME(2);',
       TO_DATE('200812230800','YYYYMMDDHH24MI')(3),
      'SYSDATE + 30/86400'(4));
     COMMIT;
END; 



위의 PL/SQL문을 확인해 보면 
  첫번째(1) 파라미터가 JOB NUMBER가 부여되는 부분이고
  두번째(2) 파라미터가 WHAT으로 프로시져 NAME 등록했습니다.
  세번째(3) 파라미터가 NEXT_DATE이며

  네번째(4) 파라미터가 잡 수행 주기를30초씩 
  수행하라는 의미입니다.



별로 어렵지 않죠??
JOB 수행주기를 조절하는 방법은 여러가지가 있지만...
대표적으로 사용되는 예를 보죠


         1. 10분에 한 번씩 실행하는 경우
             SYSDATE + 1/24/6  또는  SYSDATE + 10/1440  
            (즉, 하루를 24시간으로 나누고, 1시간을 6으로 나누면 10분이 되겠죠^^)
 
         2. 1분에 한 번씩 실행을 지정하는 경우
             SYSDATE + 1/24/60 또는 SYSDATE + 1/1440  또는 SYSDATE+60/86400
 
         3. 매일 8시간마다 지정하는 경우              
             TRUNC(SYSDATE,'MI')+8/24
 
         4. 매주 월요일밤 11시로 지정하는 경우
             NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+23/24


이와 같은 방법으로 이용할 수 있습니다...

JOB을 등록 후 JOB을 확인 하고...

SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN
FROM USER_JOBS



본인이 원하는대로 JOB이 등록 되었다면...
시간에 따라 모니터링 해 주면 되겠고..
수정이 필요하다면...
다음과같은 예를 사용해 봅시다...




BEGIN
 DBMS_JOB.REMOVE(JOB NUMBER);

 COMMIT;
 END;



-- 말 그대로 REMOVE(제거) 하는 예인데...
    USER JOBS라는 데이터 딕셔너리 뷰를 확인해 보면 'JOB NUMBER'를 알수 있어요...


BEGIN
 DBMS_JOB.NEXT_DATE(JOB NUMBER, NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+23/24);
END;

-- JOB 수행시간 변경 예 입니다...


BEGIN
 DBMS_JOB.INTERVAL(JOB NUMBER, 'TRUNC(SYSDATE,''MI'')+30/86400);
END;

-- JOB 수행간격 변경 예 입니다...


BEGIN
 DBMS_JOB.BROKEN(JOB NUMBER, TRUE);
END;

-- JOB 중지 예 입니다... 다시 살리고 싶음 DBMS_JOB.RUN() 를 사용하면 되겠죠^^


이처럼 기본적이고 간단한 예를 이용하여 JOB을 핸드링 할 수 있으니.. 한번 해 보시길 바랍니다...
간단하게나마  JOB QUEUE를 이용 ORACLE의 DBMS_JOB 패키지를 확인해 보왔습니다....


=========================================================================================
=========================================================================================

 
----------------------------------------------
# DBMS_JOB
----------------------------------------------

 
* scheduling 기능 → 10g 에서 DBMS_SCHEDULER package가 새로 나왔음.
 
(1) DBMS_JOB.SUBMIT               : job 등록
(2) DBMS_JOB.RUN                      : job 강제 실행
(3) DBMS_JOB.REMOVE               : 등록된 job 제거
(4) DBMS_JOB.INTERVAL             : job 수행 간격 설정




DBMS_JOB.SUBMIT (
    job                 out binary_integer,                -- job 번호
    what              in varchar2,                              -- 실제 작업을 수행한 SQL, PL/SQL
    next_date    in date default sysdate,      -- job 수행될 다음 일자
    interval         in varchar2 default null,       -- 다음 job 수행될 간격
    no_parse      in boolean default false,      -- true : job 수행되기 전 관련 프로시저를 파싱함

                                                                              -- job 수행 전 테이블 생성같은 다른 작업을 할 경우 사용
    instance       in binary_integer,                    -- job을 실행할 instance (default : any)
    force              in boolean default false
) ;

 
DBMS_JOB.RUN ( job, force ) ;
 
DBMS_JOB.REMOVE ( job ) ;
 
DBMS_JOB.INTERVAL( job, interval ) ;
 
* interval 표현 방법
 
'sysdate + 7'                                     : 일주일에 1번 실행
'next_day(sysdate,"TUESDAY")'    : 화요일마다 실행
'null'                                                     : 한 번만 실행됨


 

■ 실습
----------------------------------------------
--- job 실행결과를 저장하는 테이블 생성

 
CREATE TABLE job_test ( job_result varchar2(30) );
 
--- 수행할 job 프로시저
 
CREATE OR REPLACE PROCEDURE p_job_test
IS
     V_JOB_RESULT JOB_TEST.JOB_RESULT%TYPE;
BEGIN
     SELECT TO_CHAR(SYSDATE, 'YY/MM/DD HH24:MI:SS')
     INTO V_JOB_RESULT
     FROM DUAL;
   
     V_JOB_RESULT := 'JOB TEST IS ' || V_JOB_RESULT;

     INSERT INTO JOB_TEST VALUES (V_JOB_RESULT);
     COMMIT;
END;
/

 
--- job 등록 (1분에 1회 실행)
 
DECLARE
     V_JOB BINARY_INTEGER := 100;
BEGIN
    DBMS_JOB.SUBMIT (V_JOB, 'p_job_test;', SYSDATE, 'SYSDATE + 1/24/60' );
    COMMIT;  
END;
/


SELECT * FROM job_test;

 
-- 등록된 job 내역 확인 ( user_jobs.sql )
 
col PRIV_USER format a10
col INTERVAL format a30
col WHAT format a50

 
select job, priv_user, last_date, last_sec, next_date, interval, what
from user_jobs ;


 

--- job 강제로 실행
 
EXEC DBMS_JOB.RUN (61,true) ;

--- 5분 뒤 실행된 job 결과 확인

 
SELECT * FROM job_test;
 
--- 위에서 확인된 job 번호를 사용하여 job 삭제
 
EXEC  DBMS_JOB.REMOVE(61) ;
 
@ user_jobs.sql
[출처] JOB_QUEUE_PROCESSES|작성자 지영
728x90