새소식

300x250
3. Database/Oracle 기본

[Database] Oracle 스케쥴, 잡

  • -
728x90



-- ********** 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 관리하기

- 기본 문법

DBMS_JOB.submit (
job             out binary_integer, -- 실행시킬 job 번호
what           in   varchar2,        -- 실제 작업을 수행하는 PL/SQL 또는 SQL 또는 Procedure 등
next_date     in  date default sysdate,  -- job이 수행될 다음일자
interval        in  varchar2 default 'null' , -- job이 수행될 다음  시간
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. 준비

 

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

-- 2. JOB을 등록할 프로시저 생성
DECLARE JNO NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 1/24/60', FALSE);
END;
COMMIT;

--3. JOB 등록 내역 조회
SELECT * FROM USER_JOBS;

--4. 결과 확인
SELECT * FROM JOB_TEST01;

--5. 등록되어 있는 JOB 삭제
EXEC DBMS_JOB.REMOVE('64');
SELECT * FROM USER_JOBS WHERE JOBS = 잡번호;

-- 위의 2번 생성 후 주기 변경 해보자.
-- 2번 다시 실행
-- 변경문 실행
EXEC DBMS_JOB.CHANGE(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 5/24/60');


-- 잡등록 샘플
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno, '프로시저명()', SYSDATE, 'trunc(sysdate) + 1 + 1/24');
END;

-- 수정(오전 3시, 오후 3시)
BEGIN
DBMS_JOB.INTERVAL(42, 'TRUNC(SYSDATE,''MI'')+12/24');
END;


-- 등록된 스케줄을 삭제하는 쿼리
declare
begin
  dbms_job.remove( jobno );
    commit;
end ;




관련글


2017/07/17 - [4. Database/4_3 Oracle 기본] - [Database] Oracle 스케쥴, 잡(2)





300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.