본문 바로가기
IT만들기/Database

오라클 스케줄러(SCHEDULER), 잡(JOB)으로 일정 시간마다 또는 매일 자동 실행 등록하는 방법입니다.

by 커피향처럼 2021. 7. 8.

오라클에서 프로시저라든지 특정 테이블에 데이터를 적재하는 등을 일정 시간, 매일 또는 매달 실행하여 작업을 해주는 경우가 종종 있습니다.
이럴 경우 수동으로 특정 시간마다 등록하는 것이 아니라 오라클에서 일정 시간마다 반복적으로 실행하도록 할 수 있답니다.

스케줄러, 잡에 반복하는 실행문을 등록하는 것은 오라클 버전에 따라 크게 2가지 방법을 사용 할 수 있습니다.
스케줄러가 정상적으로 실행되는지 확인하기 위한 예제 테이블과 프로시저를 만들어보도록 하겠습니다.
간단하게 하기 위해 샘플 테이블에는 PK 같은거 아무것도 생성하지 않도록 할께요.

스케줄러 테스트를 위한 테이블 생성

CREATE TABLE TBL_TEST(
    NOW_COL VARCHAR2(14)
);


스케줄러 테스트를 위한 프로시저 생성

CREATE OR REPLACE PROCEDURE (P_NOW_COL IN VARCHAR2)
AS
BEGIN
    INSERT INTO TBL_TEST(NOW_COL) VALUES (P_NOW_COL);
    COMMIT;
END;
/

 

테스트 잡, 프로시저, 테이블 삭제

샘플로 테스트를 하고 결과를 확인하였으면 테스트로 만든 스케줄러 잡, 프로시저, 테이블은 삭제하도록 하겠습니다.
다음과 같이 쿼리를 실행해주세요.

-- 잡(job) 삭제
DBMS_SCHEDULER.DROP_JOB('PR_TEST_JOB');

-- 프로시저 삭제
DROP PROCEDURE PR_TEST;

-- 테이블 삭제
DROP TABLE TBL_TEST;

 

1. ORACLE 10g 이상 버전에서 스케줄러 잡 등록하기

오라클의 PL/SQL을 사용해서 다음과 같이 간단한 방법으로 자동 반복하는 잡(JOB)를 등록 할 수 있습니다.
다음의 예제는 "PR_TEST"라는 이름의 프로시저를 내일부터 매일 오전 6시에 실행하도록 등록하는 예제입니다.
PR_TEST는 "년월일시분초"를 텍스트(VARCHAR2) 파라미터로 받는 프로시저입니다.

스케줄러 잡 등록 예제

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
        JOB_NAME => 'PR_TEST_JOB'
        , START_DATE => TRUNC(SYSDATE+1)+6/24
        , REPEAT_INTERVAL => 'FREQ=DAILY;INTERVAL=1'
        , END_DATE => NULL
        , JOB_CLASS => 'DEFAULT_JOB_CLASS'
        , JOB_TYPE => 'PLSQL_BLOCK'
        , JOB_ACTION => 'BEGIN PR_TEST(TO_CHAR(SYSDATE,''YYYYMMDDHH24MISS'')); END;'
        , COMMENTS => 'JOB 등록 예제'
    );
    DBMS_SCHEDULER.ENABLE('PR_TEST_JOB');
END;

 

이렇게 스케줄러를 등록했습니다.
등록한 스케줄러는 다음의 쿼리로 등록된 내역을 확인 할 수 있어요.

SELECT * FROM ALL_SCHEDULER_JOBS WHERE JOB_NAME = 'PR_TEST_JOB';

이렇게 해서 매일 오전 6시에 실행되는 job를 등록했습니다.

지정한 시간에 스케줄러 잡이 정상적으로 실행되었는지는 다음의 쿼리로 확인 할 수 있어요.

SELECT * FROM ALL_SCHEDULER_JOB_LOG;
SELECT * FROM ALL_SCHEDULER_JOB_RUN_DETAILS;

-- 또는
SELECT * FROM USER_SCHEDULER_JOB_LOG;
SELECT * FROM USER_SCHEDULER_JOB_RUN_DETAILS;

-- DETAILS이 붙은 스케줄러 잡 로그 VIEW 테이블은 실행 실패 에러 내용을 조회 할 수 있음

다음은 각각의 옵션에 대해 설명하도록 하겠습니다.

1) JOB_NAME

   샘플에서는 "PR_TEST_JOB" 등록했습니다.
   잡 이름은 등록된 잡 이름 중에서 유니크하기만 하면 되고 스케줄러에서 잡을 삭제 할 때 잡 이름을 파라미터러 입력하여 삭제 합니다.

2) START_DATE 와 REPEAT_INTERVAL

  START_DATE와 REPEAT_INTERVAL은 스케줄러에 등록한 잡이 일정 시간마다 반복되도록 하는 옵션으로 서로 연관 관계가 있습니다.
  START_DATE는 잡이 최초로 실행되는 시간을 지정하며 REPEAT_INTERVAL은 반복되는 형식을 지정합니다.
  샘플의 "TRUNC(SYSDATE+1)"은 내일을 의미합니다.
  SELECT TRUNC(SYSDATE+1) FROM DUAL;
이렇게 쿼리를 실행하면 내일 일자가 나올겁니다.

그럼 오늘은?
"TRUNC(SYSDATE)"로 입력하면 되겠죠?
잡 등록 샘플의 6/24는 오전 6시를 의미하는 값입니다.

3) END_DATE

잡의 만료 시간입니다.
영구적으로 반복적으로 실행 되기를 바라면 NULL을 입력합니다.
일주일만 실행되기를 바라면 "TRUNC(SYSDATE+7)" 등으로 등록하면 됩니다.

 

6) COMMENTS

comments는 스케줄러 잡의 설명문이며 ALL_SCHEDULER_JOBS VIEW를 조회하면 확인 할 수 있습니다.

 

 

 

 

 

 

 

 

 

댓글