728x90
출처: https://blog.naver.com/dandywoobin/10041617559
일정한 시간 ,일정한 간격으로 반복적으로 수행되어지는 JOB을 JOB QUEUE를 사용하여 스케줄링 할 수 있으며 JOB을 스케줄링 하기 위해서 ORACLE의 DBMS_JOB 패키지를 이용합니다..
이를 위해서는 JOB_QUEUE_PROCESSES 를 설정해야 하는데.... 초기 파라미터를 '0'으로 설정하면 ...JOB_QUEUE_PROCESSES 의 시작은 물론 등록된 어떠한 JOB도 실행되질 않습니다... 반드시 유념해 두셔야 겠죠^^ 반드시 파라미터의 값을 설정해야 하며 'ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 50' 이렇게 설정할 수 있습니다... 파라미터 값을 정했으면 JOB을 등록 해야겠죠? DBMS_JOBS의 패키지에 있는 프로시져를 이용하여 쉽게 등록 할 수 있는데... DBMS_JOB을 이용하여 이처럼 사용하면 특정시간, 특정요일, 특정일, 30초단위, 매분 정각, 매시정각 등 다양하게 잡을 사용할 수 있으며 또한 ETL 을 이용할 때도 유용하게 사용할 수 있습니다. 다음 예를 보시죠^^ DECLARE V_JOBID NUMBER; BEGIN DBMS_JOB.SUBMIT(V_JOBID(1),'프로시져 NAME(2);', TO_DATE('200812230800','YYYYMMDDHH24MI')(3), 'SYSDATE + 30/86400'(4)); COMMIT; END; 위의 PL/SQL문을 확인해 보면 첫번째(1) 파라미터가 JOB NUMBER가 부여되는 부분이고 두번째(2) 파라미터가 WHAT으로 프로시져 NAME 등록했습니다. 세번째(3) 파라미터가 NEXT_DATE이며 네번째(4) 파라미터가 잡 수행 주기를30초씩 수행하라는 의미입니다. 별로 어렵지 않죠?? JOB 수행주기를 조절하는 방법은 여러가지가 있지만... 대표적으로 사용되는 예를 보죠 1. 10분에 한 번씩 실행하는 경우 SYSDATE + 1/24/6 또는 SYSDATE + 10/1440
(즉, 하루를 24시간으로 나누고, 1시간을 6으로 나누면 10분이 되겠죠^^) 2. 1분에 한 번씩 실행을 지정하는 경우
SYSDATE + 1/24/60 또는 SYSDATE + 1/1440 또는 SYSDATE+60/86400
3. 매일 8시간마다 지정하는 경우
TRUNC(SYSDATE,'MI')+8/24 4. 매주 월요일밤 11시로 지정하는 경우
NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+23/24
JOB을 등록 후 JOB을 확인 하고...이와 같은 방법으로 이용할 수 있습니다... SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS 본인이 원하는대로 JOB이 등록 되었다면... 시간에 따라 모니터링 해 주면 되겠고.. 수정이 필요하다면... 다음과같은 예를 사용해 봅시다... BEGIN DBMS_JOB.REMOVE(JOB NUMBER); COMMIT; END; -- 말 그대로 REMOVE(제거) 하는 예인데... USER JOBS라는 데이터 딕셔너리 뷰를 확인해 보면 'JOB NUMBER'를 알수 있어요... BEGIN DBMS_JOB.NEXT_DATE(JOB NUMBER, NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+23/24); END; -- JOB 수행시간 변경 예 입니다... BEGIN DBMS_JOB.INTERVAL(JOB NUMBER, 'TRUNC(SYSDATE,''MI'')+30/86400); END; -- JOB 수행간격 변경 예 입니다... BEGIN DBMS_JOB.BROKEN(JOB NUMBER, TRUE); END; -- JOB 중지 예 입니다... 다시 살리고 싶음 DBMS_JOB.RUN() 를 사용하면 되겠죠^^ 이처럼 기본적이고 간단한 예를 이용하여 JOB을 핸드링 할 수 있으니.. 한번 해 보시길 바랍니다... 간단하게나마 JOB QUEUE를 이용 ORACLE의 DBMS_JOB 패키지를 확인해 보왔습니다.... ========================================================================================= ========================================================================================= ---------------------------------------------- # DBMS_JOB ---------------------------------------------- * scheduling 기능 → 10g 에서 DBMS_SCHEDULER package가 새로 나왔음. (1) DBMS_JOB.SUBMIT : job 등록 (2) DBMS_JOB.RUN : job 강제 실행 (3) DBMS_JOB.REMOVE : 등록된 job 제거 (4) DBMS_JOB.INTERVAL : job 수행 간격 설정 DBMS_JOB.SUBMIT ( job out binary_integer, -- job 번호 what in varchar2, -- 실제 작업을 수행한 SQL, PL/SQL next_date in date default sysdate, -- job 수행될 다음 일자 interval in varchar2 default null, -- 다음 job 수행될 간격 no_parse in boolean default false, -- true : job 수행되기 전 관련 프로시저를 파싱함 -- job 수행 전 테이블 생성같은 다른 작업을 할 경우 사용 instance in binary_integer, -- job을 실행할 instance (default : any) force in boolean default false ) ; DBMS_JOB.RUN ( job, force ) ; DBMS_JOB.REMOVE ( job ) ; DBMS_JOB.INTERVAL( job, interval ) ; * interval 표현 방법 'sysdate + 7' : 일주일에 1번 실행 'next_day(sysdate,"TUESDAY")' : 화요일마다 실행 'null' : 한 번만 실행됨 ■ 실습 ---------------------------------------------- --- job 실행결과를 저장하는 테이블 생성 CREATE TABLE job_test ( job_result varchar2(30) ); --- 수행할 job 프로시저 CREATE OR REPLACE PROCEDURE p_job_test IS V_JOB_RESULT JOB_TEST.JOB_RESULT%TYPE; BEGIN SELECT TO_CHAR(SYSDATE, 'YY/MM/DD HH24:MI:SS') INTO V_JOB_RESULT FROM DUAL; V_JOB_RESULT := 'JOB TEST IS ' || V_JOB_RESULT; INSERT INTO JOB_TEST VALUES (V_JOB_RESULT); COMMIT; END; / --- job 등록 (1분에 1회 실행) DECLARE V_JOB BINARY_INTEGER := 100; BEGIN DBMS_JOB.SUBMIT (V_JOB, 'p_job_test;', SYSDATE, 'SYSDATE + 1/24/60' ); COMMIT; END; / SELECT * FROM job_test; -- 등록된 job 내역 확인 ( user_jobs.sql ) col PRIV_USER format a10 col INTERVAL format a30 col WHAT format a50 select job, priv_user, last_date, last_sec, next_date, interval, what from user_jobs ; --- job 강제로 실행 EXEC DBMS_JOB.RUN (61,true) ; --- 5분 뒤 실행된 job 결과 확인 SELECT * FROM job_test; --- 위에서 확인된 job 번호를 사용하여 job 삭제 EXEC DBMS_JOB.REMOVE(61) ; @ user_jobs.sql [출처] JOB_QUEUE_PROCESSES|작성자 지영
|
728x90
반응형
'정보관리(데이터베이스, DB) > 오라클' 카테고리의 다른 글
ORA-12541: TNS : 리스너가 없습니다.(no listener) (0) | 2023.11.28 |
---|---|
리눅스에서 Oracle 서비스 시작 및 종료 (0) | 2023.11.28 |
Oracle returns an error ORA-01031: insufficient privileges (0) | 2023.11.28 |
Oracle Character Set 변경 방법 (0) | 2023.11.28 |
IMP-00038: Could not convert to environment character set's handle (0) | 2023.11.27 |