본문 바로가기
킷도우의 IT/데이터베이스(Database)

[실무 경험담] Oracle(오라클) Job 등록 방법

by 킷도우 2022. 12. 20.
반응형

안녕하세요. IT Window 킷도우입니다.

어느새 이번 주가 크리스마스라는 사실이 정말 놀랍네요. 시간 참 빠른 것 같습니다.

하루 하루 소중하게 보내는게 참 중요한 것 같습니다.

 

오늘 여러분들에게 공유드릴 주제는 바로 오라클 Job 등록하는 방법입니다. IT 시스템을 유지보수 해보신 분이라면 한 번쯤은 써 보셧을 텐데요. 그럼 바로 오라클 Job 등록 방법 공유 드리겠습니다.

 

오라클 job을 등록하기 위해 간단하게 실습 환경을 구성해 볼건데요.

아래와 같이 간단하게 테이블 하나를 만들어 줍니다.

오라클 Job 등록을 위한 테이블 생성

그리고 오라클 Job을 통해 주기적으로 특정 프로시저를 수행하도록 만들어 줄 것이기 때문에 프로시저 하나를 만들어 주겠습니다. 이 프로시저는 위에서 만든 IMSI 테이블에 SYSDATE를 INSERT하는 쿼리를 수행합니다.

--오라클 JOB 등록을 위한 프로시저 생성
CREATE OR REPLACE PROCEDURE PR_UPDATE_DATE
IS
BEGIN
	INSERT INTO IMSI
	VALUES(SYSDATE);
	COMMIT;
	EXCEPTION
		WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('예상치 못한 에러가 발생했습니다.');
		ROLLBACK;
	RETURN;
END PR_UPDATE_DATE;

네 그러면 이제 본론으로 들어가서 오라클 잡을 한 번 만들어 보겠습니다.

 

1. 오라클 Job 생성

위에서 만든 PR_UPDATE_DATE 프로시저를 JOB 생성 후 1분 후 최초 수행하고 그 뒤로는 10초 간격으로 계속 프로시저가 실행되는 JOB을 만들어 보겠습니다.

DECLARE
  jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT
    (  JOB       => jobno                   -- jon sequence, 임의의 숫자가 생성할 때마다 순차적으로 배정됨
     , WHAT      => 'MAN.PR_UPDATE_DATE;'   -- 실행할 프로시저 지정 ';' 특수문자 주의!!
     , NEXT_DATE =>  SYSDATE + 1/24/60		-- 1분후
     , INTERVAL  => 'SYSDATE + 1/24/60/6'	-- 10초 간격
     , NO_PARSE  => TRUE                    -- 프로시저를 job이 처음 실행될 때 파싱
    );
END;

※ 시간 설정 방법

SYSDATE+7 : 7일에 한번 씩 job 수행
SYSDATE+1/24 : 1시간에 한번 씩 job 수행
TRUNC(SYSDATE, 'MI')+8/24 : 최초 job 수행시간이 12:29분 일 경우 매시 12:29분에 job 수행
TRUNC(SYSDATE+1) : 매일 밤 12시에 job 수행
TRUNC(SYSDATE+1)+3/24 : 매일 오전 3시 job 수행
NEXT_DAY(TRUNC(SYSDATE),'SUNDAY')+22/24 : 매주 일요일 오후 10시 정각에 job 수행
TRUNC(LAST_DAY(SYSDATE))+1 : 매월 1일 밤 12시에 job 수행
TRUNC(LAST_DAY(SYSDATE))+1+ 9/24 +30/1440 : 매월 1일 오전 9시 30분

 

2. 등록한 오라클 Job 확인

SELECT * 
  FROM USER_JOBS;

오라클 Job 최초 수행 결과

LAST_DATE : 마지막 Job이 실행된 일자, 시간(최초 Job 생성시엔 NULL)

LAST_DATE : 마지막 Job 실행 예정 시간(최초 Job 생성시엔 NULL)

NEXT_DATE : 다음 Job 실행 예정 일자, 시간

NEXT_SEC : 다음 Job 실행 예정 시간

TOTAL_TIME : Job 수행 시 소요 시간

BROKEN : 활성화(N), 비활성화(Y) 여부(컬럼명이 BROKEN이라 그런지 Y/N이 반대로 설정된 듯 합니다)

INTERVAL : Job 실행 간격

FAILURES : JOB 수행 실패 횟수

WHAT : 수행할 OBJECT(PR_UPDATE_DATE)

오라클 Job 생성 후 약 1분 뒤 조회 결과

오라클 Job 생성 후 약 1분 뒤 컬럼 변화

→ LAST_DATE : 2022-12-20 22:19:35

→ NEXT_DATE : 2022-12-20 22:19:45

그리고 또 약 40초 뒤

그리고 또 약 40초 뒤 컬럼 변화

→ LAST_DATE : 2022-12-20 22:20:05

→ NEXT_DATE : 2022-12-20 22:20:15

 

3. 결과 확인(테이블이 잘 변경 됐는지)

IMSI 테이블 결과

최초 1분 뒤 Job이 수행된 이후 10초 간격으로 꾸준히 job이 수행되어 REG_DT에 SYSDATE가 INSERT된 것을 확인할 수 있습니다.

 

4. 번외 추가 문법

Job 내용 변경하는 법
BEGIN
	DBMS_JOB.CHANGE(10, --JOB번호
        what => 'HRCS.PR_UPDATE_DATE',
        next_date => TO_DATE('2023/03/03 01:30:00','YYYY/MM/DD HH24:MI:SS'),
        interval => 'TRUNC(SYSDATE+1)+7/24');
END;

 

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

 

오라클 Job 강제 수행
BEGIN
   DBMS_JOB.RUN(10); --job번호
   COMMIT;
END;

 

오라클 Job 제거
(delete from USER_JOBS 안됩니다!!)
BEGIN
    DBMS_JOB.REMOVE(10); --job 번호
    COMMIT;
END;

 

이상으로 오라클 Job 등록하는 방법과 기타 사용법들을 같이 알아봤습니다.

작은 도움 됐기를 바라면서 이만 글 마치겠습니다.

감사합니다!

반응형

댓글