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 관리하기
- 기본 문법
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
CREATE TABLE JOB_TEST01 ( NO NUMBER, NAME VARCHAR2(10) );
DROP TABLE JOB_TEST01;
CREATE SEQUENCE JOB_TEST_SEQ;
DROP SEQUENCE JOB_TEST_SEQ;
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;
-- 등록된 스케줄을 삭제하는 쿼리
declare
begin
dbms_job.remove( jobno );
commit;
end ;
출처: https://goddaehee.tistory.com/50 [갓대희의 작은공간]