Oracle에서 주기적으로 작업을 실행해야 하는 경우 Application Server의 스케쥴러나 유닉스 / 리눅스의
Crontab처럼 DBMS_JOB 패키지를 이용하면 관리가 편리합니다.
Oracle 10g 부터는 확장된 기능인 DBMS_SCHEDULER 패키지도 지원이 되는데요.
오늘은 DBMS_JOB 패키지를 이용한 Job 생성 등록 삭제 조회 등에 대해 포스팅하겠습니다.
Oracle Job - DBMS_JOB 패키지
DBMS_JOB 패키지를 이용한 Oracle Job 관리하는 방법입니다.
DBMS_JOB 패키지 프로시저 종류
패키지 명(종류) | 기능 |
DBMS_JOB.submit | job 등록 |
DBMS_JOB.remove | job 제거 |
DBMS_JOB.change | job 변경 |
DBMS_JOB.netx_date | job 다음 수행시간 변경 |
DBMS_JOB.interval | job 실행 간격 지정 |
DBMS_JOB.what | 작업이 실행할 프로시저를 변경합니다. |
DBMS_JOB.run | job을 수동으로 실행 |
DBMS_JOB.broken | job을 비활성화 or 활성화 |
DBMS_JOB.instance | 실행될 인스턴스를 할당 |
DBMS_JOB.user_export | 지정된 작업을 내보내거나 지정된 작업과 인스턴스 선호도로 내보냅니다. |
Test 전용 테이블과 프로시저 생성
Job Test를 위한 테이블과 프로시저를 생성하였습니다.
실행할 때마다 실행시간이 기록되는 간단한 프로시저입니다.
/* 임시 테이블 생성 */
CREATE TABLE TB_TEST01
(
-- 실행시간
EXEC_TIME DATE
);
/* 프로시저 생성 */
CREATE OR REPLACE PROCEDURE P_ORACLE_JOB_TEST01
IS
BEGIN
-- 현지시간을 기록한다.
INSERT INTO TB_TEST01(EXEC_TIME)
VALUES ( SYSDATE );
END;
Job 생성 및 확인
▼ Job 생성
/*
P_ORACLE_JOB_TEST01을 1분후 6초 간격으로
실행하는 Job을 생성하였습니다.
*/
DECLARE
X NUMBER;
BEGIN
SYS.DBMS_JOB.SUBMIT
( JOB => X
, WHAT => 'P_ORACLE_JOB_TEST01;'
, NEXT_DATE => SYSDATE + 1/24/60 -- 1분후
, INTERVAL => 'SYSDATE + 1/24/60/10' -- 6초 간격
, NO_PARSE => TRUE
);
END;
▼ 등록된 Job 확인
SELECT *
FROM USER_JOBS;
▼ JOB : Job No
LAST_DATE : 마지막 실행시간
NEXT_DATE : 다음 실행 시간 / NEXT_DATE - LAST_DATE ===> Interval
TOTAL_TIME : 실행시간
BROKEN : 활성화 비활성화 여부
FAILURES : 실패 횟수
WHAT : 실행할 Object / "P_ORACLE_JOB_TEST01;" <== ";" 꼭 넣으세요. Job 실행하면서 에러 날 수 있습니다.
▼ Interval 예제
1. 10분 간격으로 실행
SYSDATE + 1/24/6
2. 현재 시간으로 부터 하루 뒤 다음 날 현재 시간에 실행 (매일)
SYSDATE + 1
3. 매일 새벽 5시
TRUNC(SYSDATE) + 1 + 5 / 24
4. 매일 밤 10시
TRUNC(SYSDATE) + 20 / 24
5. 1분 간격
SYSDATE + 1/24/60
DBMS_JOB 패키지
BROKEN (job no , true or false) : 작업을 활성화 비활성화
BEGIN
DBMS_JOB.BROKEN(23, false); -- 비활성화
COMMIT;
END;
CHANGE : Job의 내용을 수정
DBMS_JOB.CHANGE (
job IN BINARY_INTEGER,
what IN VARCHAR2,
next_date IN DATE,
interval IN VARCHAR2,
instance IN BINARY_INTEGER DEFAULT NULL,
force IN BOOLEAN DEFAULT FALSE);
BEGIN
-- 1분간격으로 변경
DBMS_JOB.CHANGE(23, null, SYSDATE, 'SYSDATE + 1/24/60');
COMMIT;
END;
INTERVAL : Job의 간격 변경
DBMS_JOB.INTERVAL (
job IN BINARY_INTEGER,
interval IN VARCHAR2);
BEGIN
-- 10초 간격으로 변경
DBMS_JOB.INTERVAL(23, 'SYSDATE + 1/24/60/6');
END;
NEXT_DATE : Job 다음 실행 시간 수정
DBMS_JOB.NEXT_DATE (
JOB IN BINARY_INTEGER,
NEXT_DATE IN DATE
);
RUN : Job을 강제 실행한다.
BEGIN
DBMS_JOB.RUN(23);
COMMIT;
END;
REMOVE : Job을 삭제(제거) 한다.
BEGIN
DBMS_JOB.REMOVE(23);
COMMIT;
END;
WHAT : 실행할 프로시저를 변경한다.
EXECUTE DBMS_JOB.WHAT(
23,'Test Procedure;'
);
'IT > 데이터베이스' 카테고리의 다른 글
Oracle SYS / SYSTEM 유저 패스워드 변경하는 방법입니다. (0) | 2020.11.08 |
---|---|
[Oracle] 테이블 정보 조회하기 (0) | 2020.10.15 |
[DBeaver 설치] Linux CentOS 7/8, Fedora (0) | 2020.05.12 |
Oracle Table 권한부여 하기 (0) | 2020.04.09 |
DBeaver 실행 쿼리 히스토리 보기 (0) | 2020.03.23 |
최근댓글