새소식

300x250
3. Database/Oracle 기본

[Database] Oracle 스케쥴, 잡(2)

  • -
728x90



-- ********** 2ST. DBMS_SCHEDULER*************
/*
10g이상에서만 사용가능
dbms_job 패키지보다 확장된 기능으로 dbms_job 에서 안되는 외부 스크립트를 실행 할 수 있음
(1) 주요특징
- 오라클에서 생성된 프로시저나 함수 외에 os에서 생성된 각종 유틸이나 프로그램까지도 실행가능
- 설정할 때 일반적으로 사용하는 자연어를 사용하여 편하게 설정 가능
- db 내부이벤트까지 추적가능하기 때문에 os나 dbms_job 보다 훨씬 다양하게 작업을 체크하고 수행가능

이 작업을 하기 위해선 해당 계정이 create any job 권한을 가지고 있어야 함
계정에 권한 부여
grant create any job to 계정 ;

(2) 구성
- program : 이 부분에 dbms_scheduler가 수행할 프로그램이나 프로시저, 스크립트 등에 대한 정보를 저장해서 별도로 생성할 수 있음
- schedule : 이 부분에 dbms_scheduler 가 수행할 job 이 실제 수행할 시간이나 실행 주기등을 별도로 생성 할 수 있음
- job : 새로 생성할 job 부분을 정의

실습 1. 신규 job 생성하기
job_tetst1 이라는 테이블에 3초에 1회씩 데이터를 insert 하는 작업을 설정
*/

CREATE SEQUENCE JOB_TEST_SEQ;
DROP SEQUENCE JOB_TEST_SEQ;

-- 1. 테이블 생성
CREATE TABLE JOB_TEST02 (NO NUMBER, NAME VARCHAR2(10));
DROP TABLE JOB_TEST02;
SELECT * FROM JOB_TEST02;

EXEC INSERT_JOB_TEST02;
-- 2. 프로시저 생성
CREATE OR REPLACE PROCEDURE INSERT_JOB_TEST02
  IS
    BEGIN
      INSERT INTO JOB_TEST02 (NO, NAME) VALUES (JOB_TEST_SEQ.NEXTVAL, DBMS_RANDOM.string('a', 2));
    END;
DROP PROCEDURE INSERT_JOB_TEST02;

BEGIN DBMS_SCHEDULER.CREATE_JOB(
  JOB_NAME => 'INSERT_JOB_TEST02'   -- DBMS_SCHEDULE 내에서 사용 될 JOB 이름 지정
  , JOB_TYPE => 'PLSQL_BLOCK'
/*
 1) 실제 PL/SQL 블록 
 2) 프로시저 이름
 3) OS에 있는 실행파일
 4) program_name 으로 미리생성해둔 프로그램 이름
 5) chained 값으로 생성된 체인
  */
  , JOB_ACTION => 'BEGIN INSERT_JOB_TEST02; END;'    -- 실제 실행될 프로그램을 적는 부분
  ,START_DATE => SYSTIMESTAMP                         -- 처음 시작될 시간 지정
  ,REPEAT_INTERVAL => 'FREQ=SECONDLY; INTERVAL=3'      -- 반복 주기 지정
  );
  /*
  repeat_interval => 'freq=hourly ; interval=1'           <- 1시간 간격으로 수행하도록 설정
  repeat_interval => 'freq=minutely ; interval=30'        <- 30분 간격으로 수행하도록 설정
  repeat_interval => 'freq=secondly ; interval=5'         <- 5초 간격으로 수행하도록 설정     
  repeat_interval => 'freq=weekly ; interval=2'           <- 2주 간격으로 수행
  repeat_interval => 'freq=hourly ; interval=1'           <- 매달 수행하도록 설정
  repeat_interval => 'freq=hourly ; interval=1'           <- 매년 수행하도록 설정
  */
END;

BEGIN DBMS_SCHEDULER.CREATE_JOB(
  JOB_NAME => 'SCHEDULER_JOB_TEST02'   -- DBMS_SCHEDULE 내에서 사용 될 JOB 이름 지정
  , JOB_TYPE => 'PLSQL_BLOCK'
  , JOB_ACTION => 'BEGIN INSERT_JOB_TEST02; END;'    -- 실제 실행될 프로그램을 적는 부분
  , START_DATE => SYSTIMESTAMP                         -- 처음 시작될 시간 지정
  , REPEAT_INTERVAL => 'FREQ=minutely; INTERVAL=1'      -- 반복 주기 지정
  );
END;


BEGIN DBMS_SCHEDULER.CREATE_JOB(
  JOB_NAME => 'SCHEDULER_JOB_TEST02'   -- DBMS_SCHEDULE 내에서 사용 될 JOB 이름 지정
  , JOB_TYPE => 'STORED_PROCEDURE'
  , JOB_ACTION => 'INSERT_JOB_TEST02'    -- 실제 실행될 프로그램을 적는 부분
  , START_DATE => SYSDATE                         -- 처음 시작될 시간 지정
  , REPEAT_INTERVAL => 'FREQ=minutely; INTERVAL=1'      -- 반복 주기 지정
  );
END;

BEGIN dbms_scheduler.enable('SCHEDULER_JOB_TEST02'); END;    -- 사용가능
--BEGIN DBMS_SCHEDULER.RUN_JOB('SCHEDULER_JOB_TEST02'); END;   -- 시작
BEGIN dbms_scheduler.disable ('SCHEDULER_JOB_TEST02');END; -- 일시중지
BEGIN dbms_scheduler.enable ('SCHEDULER_JOB_TEST02');END;  -- 다시시작

-- 잡실행 확인
select s.job_name, s.job_type, o.object_id, s.enabled, o.created, cast(s.next_run_date as date) next_run_date, s.state, s.job_class, schedule_type
from  dba_objects o
      , dba_scheduler_jobs s
where o.object_type = 'JOB' order by created desc;

-- 특정 잡 삭제
begin
  dbms_scheduler.drop_job('SCHEDULER_JOB_TEST02');
end;

--등록된 job
SELECT * FROM USER_SCHEDULER_JOBS;
--job의 log
SELECT * FROM USER_SCHEDULER_JOB_LOG ORDER BY LOG_DATE DESC;





관련글


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





300x250
Contents

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

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