반응형

Oracle에서 주기적으로 작업을 실행해야 하는 경우 Application Server의 스케쥴러나 유닉스 / 리눅스의

Crontab처럼 DBMS_JOB 패키지를 이용하면 관리가 편리합니다.

Oracle 10g 부터는 확장된 기능인 DBMS_SCHEDULER 패키지도 지원이 되는데요.

오늘은 DBMS_JOB 패키지를 이용한 Job 생성 등록 삭제 조회 등에 대해 포스팅하겠습니다.

 

 

Oracle Job - DBMS_JOB 패키지

DBMS_JOB 패키지를 이용한 Oracle Job 관리하는 방법입니다.

 

DBMS_JOB 패키지 프로시저 종류

패키지 명(종류) 기능
DBMS_JOB.submit job 등록
DBMS_JOB.remove job 제거
DBMS_JOB.change job 변경
DBMS_JOB.netx_date job 다음 수행시간 변경
DBMS_JOB.interval job 실행 간격 지정
DBMS_JOB.what 작업이 실행할 프로시저를 변경합니다.
DBMS_JOB.run  job을 수동으로 실행
DBMS_JOB.broken job을 비활성화 or 활성화
DBMS_JOB.instance 실행될 인스턴스를 할당
DBMS_JOB.user_export 지정된 작업을 내보내거나 지정된 작업과 인스턴스 선호도로 내보냅니다.

 

Test 전용 테이블과 프로시저 생성

Job Test를 위한 테이블과 프로시저를 생성하였습니다.

실행할 때마다 실행시간이 기록되는 간단한 프로시저입니다.

 

/*	임시 테이블 생성 	*/
CREATE TABLE TB_TEST01
(
	-- 실행시간
	EXEC_TIME	DATE
);
   
   
/* 	프로시저 생성	*/
CREATE OR REPLACE PROCEDURE P_ORACLE_JOB_TEST01
IS
	BEGIN
		-- 현지시간을 기록한다.
		INSERT INTO TB_TEST01(EXEC_TIME) 
		VALUES ( SYSDATE );
	END;

 

Job 생성 및 확인

▼ Job 생성

/*
	P_ORACLE_JOB_TEST01을 1분후 6초 간격으로 
	실행하는 Job을 생성하였습니다.
*/

DECLARE
  X NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
    (  JOB       => X 
     , WHAT      => 'P_ORACLE_JOB_TEST01;'
     , NEXT_DATE =>  SYSDATE + 1/24/60		-- 1분후
     , INTERVAL  => 'SYSDATE + 1/24/60/10'	-- 6초 간격
     , NO_PARSE  => TRUE
    );
END;

 

▼ 등록된 Job 확인

SELECT * 
  FROM USER_JOBS;

 

▼ JOB : Job No

    LAST_DATE : 마지막 실행시간

    NEXT_DATE : 다음 실행 시간 / NEXT_DATE - LAST_DATE ===> Interval

    TOTAL_TIME : 실행시간

    BROKEN : 활성화 비활성화 여부

    FAILURES : 실패 횟수

    WHAT : 실행할 Object / "P_ORACLE_JOB_TEST01;"     <== ";" 꼭 넣으세요. Job 실행하면서 에러 날 수 있습니다.

   

 

▼ Interval 예제

1. 10분 간격으로 실행

    SYSDATE + 1/24/6

 

2. 현재 시간으로 부터 하루 뒤 다음 날 현재 시간에 실행 (매일)

    SYSDATE + 1 

 

3. 매일 새벽 5시

TRUNC(SYSDATE) + 1 + 5 / 24

 

4. 매일 밤 10시

TRUNC(SYSDATE)  + 20 / 24

 

5. 1분 간격

SYSDATE + 1/24/60

 

DBMS_JOB 패키지

 

BROKEN (job no , true or false) : 작업을 활성화 비활성화

 

BEGIN
	DBMS_JOB.BROKEN(23, false); -- 비활성화
	COMMIT;
END;

 

 

CHANGE : Job의 내용을 수정

 

DBMS_JOB.CHANGE ( 
   job       IN  BINARY_INTEGER,
   what      IN  VARCHAR2,
   next_date IN  DATE,
   interval  IN  VARCHAR2,
   instance  IN  BINARY_INTEGER DEFAULT NULL,
   force     IN  BOOLEAN DEFAULT FALSE);

BEGIN
   -- 1분간격으로 변경
   DBMS_JOB.CHANGE(23, null, SYSDATE, 'SYSDATE + 1/24/60');
   COMMIT;
END; 

 

 

INTERVAL : Job의 간격 변경

DBMS_JOB.INTERVAL ( 
   job       IN  BINARY_INTEGER,
   interval  IN  VARCHAR2);

BEGIN
	-- 10초 간격으로 변경
	DBMS_JOB.INTERVAL(23, 'SYSDATE + 1/24/60/6');
END;

 

 

NEXT_DATE : Job 다음 실행 시간 수정

DBMS_JOB.NEXT_DATE (
	JOB IN BINARY_INTEGER,
	NEXT_DATE IN DATE
);

 

 

RUN : Job을 강제 실행한다.

BEGIN
   DBMS_JOB.RUN(23);
   COMMIT;
END;

 

REMOVE : Job을 삭제(제거) 한다.

BEGIN
    DBMS_JOB.REMOVE(23);
    COMMIT;
END;

 

 

WHAT : 실행할 프로시저를 변경한다.

EXECUTE DBMS_JOB.WHAT(
	23,'Test Procedure;'
);

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기