-- ********** 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 스케쥴, 잡