Oracle 오라클 배치, Job 스케쥴


Oracle 오라클 배치, Job 스케쥴

-- ********** 1ST. DBMS_JOB*************

주기적으로 수행되어지는 JOB을 JOB QUEUE를 사용하여 스케줄링 할 수 있다.

(데이터베이스 내에 생성한 프로시저 함수들에 대해 데이터베이스 내의 스케줄러에게 지정한 시간에 자동으로 작업이 진행될 수 있도록 하는 기능)

JOB을 스케줄링 하기 위해서 ORACLE의 DBMS_JOB 패키지를 이용하며 JOB QUEUE PROCESS가 JOB QUEUE안의 잡을 수행한다.

JOB으로 등록될 수 있는 것은 PL/SQL 프로시저 또는 패키지가 되며, 유닉스에서 CRON에 등록하여 사용하는 것과 유사하다고 하다.

CRON JOB은 OS가 직접 관리하고 실행하지만 DBMS_JOB에 등록된 JOB은 오라클이 관리한다.

ORACLE 에서 DBMS_JOB 패키지를 이용해서 주기적으로 작업을 실행하는 방법 이다.

특정시간에 특정 기능을 수행하게 하는 명령어라고 볼 수 있다.


간단한 설명

job_queue_process = 1 : SNP 프로세스의 개수를 지정

job_queue_interval = 60 : SNP 프로세스가 Sleep 상태에서 깨어나는 간격을 초로 지정

패키지에 있는 프로시저

submit : 새로운 작업을 job quere 목록에 등록

remove : job queue 에 등록된 job 을 제거

change : job queue 에 등록된 job 을 변경

next_date : job queue 에 등록된 job 의 작동시간을 변경

interval : job queue 에 등록된 job 의 수행 주기를 변경

what : 수행할 procedure or package 변경

run : 등록되어 있는 특정 job 을 수동으로 수행




1) job 관리하기

- 기본 문법

  1. DBMS_JOB.submit (
  2. job out binary_integer, -- 실행시킬 job 번호
  3. what in varchar2, -- 실제 작업을 수행하는 PL/SQL 또는 SQL 또는 Procedure 등
  4. next_date in date default sysdate, -- job이 수행될 다음일자
  5. interval in varchar2 default 'null' , -- job이 수행될 다음 시간
  6. no_parse in boolean default false ) --

- 주요 파라미터 의미   


job : job 번호로 다른 프로시저에서 호출될 수 있음

what : 수행할 pl/sql or procedure or package 이름을 지정, 직접 수행하기를 원하는 sql문 적어도 됨

next_date : 다음에 수행될 시간을 지정

interval : 수행되는 주기를 지정, 초단위까지 지정가능

no_parse : parse 여부를 지정, 기본값은 false 로 parse를 수행


- 주기 예제

sysdate + 7 : 7일에 한번

sysdate + 1 : 하루에 한번

sysdate + 1/24 : 한 시간에 한번

sysdate + 1/1440 : 1분에 한번(24*60)

sysdate + 1/86400 : 1ch (24*60*60)

*/


-- 실습 : JOB_TEST01 테이블 생성 1분마다 1번씩 데이터 INSERT

  1. CREATE TABLE JOB_TEST01 ( NO NUMBER, NAME VARCHAR2(10) );
  2. DROP TABLE JOB_TEST01;
  1. CREATE SEQUENCE JOB_TEST_SEQ;
  2. DROP SEQUENCE JOB_TEST_SEQ;
  1. CREATE OR REPLACE PROCEDURE INSERT_JOB_TEST01
  2. IS
  3. BEGIN
  4. -- DBMS_RANDOM.VALUE(low IN NUMBER, high IN NUMBER)
  5. -- 파라미터 low : 최소범위 -- high : 최대 범위
  6. INSERT INTO JOB_TEST01 VALUES ( JOB_TEST_SEQ.NEXTVAL, DBMS_RANDOM.STRING('A', 3));
  7. END;
  8. DROP PROCEDURE INSERT_JOB_TEST01;


-- 2. JOB을 등록할 프로시저 생성

  1. DECLARE JNO NUMBER;
  2. BEGIN
  3. DBMS_JOB.SUBMIT(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 1/24/60', FALSE);
  4. END;
  5. COMMIT;


--3. JOB 등록 내역 조회

  1. SELECT * FROM USER_JOBS;


--4. 결과 확인

  1. SELECT * FROM JOB_TEST01;


--5. 등록되어 있는 JOB 삭제

  1. EXEC DBMS_JOB.REMOVE('64');
  2. SELECT * FROM USER_JOBS WHERE JOBS = 잡번호;


-- 위의 2번 생성 후 주기 변경 해보자.

-- 2번 다시 실행

-- 변경문 실행

  1. EXEC DBMS_JOB.CHANGE(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 5/24/60');


-- 잡등록 샘플

  1. VARIABLE jobno NUMBER
  2. BEGIN
  3. DBMS_JOB.SUBMIT(:jobno, '프로시저명()', SYSDATE, 'trunc(sysdate) + 1 + 1/24');
  4. END;


-- 등록된 스케줄을 삭제하는 쿼리

  1. declare
  2. begin
  3. dbms_job.remove( jobno );
  4. commit;
  5. end ;


출처: https://goddaehee.tistory.com/50 [갓대희의 작은공간]

* 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
작성자 소개
초이 프로필
WrapUp 블로거

초이

반려견을 좋아하고, 차를 좋아하고, 여행을 좋아하고, 맛집을 찾아 즐기는 웹 개발자 입니다^^