Notice
Recent Posts
Recent Comments
Link
투케이2K
124. (Oracle/오라클) JOB 스케줄링 수행 배치 프로그램 만들기 실시 - 일정 시간 마다 자동 수행 본문
/* =========================== */
[ 개발 환경 설정 ]
개발 툴 : Toad
개발 언어 : Oracle
/* =========================== */
/* =========================== */
[주요 로직]
1. 테이블 생성 : job 스케줄링 실행한 로그 결과를 담는 테이블
2. 프로시저 생성 : job 스케줄링 수행 시 주기적으로 호출되는 프로시저
3. job 스케줄링 생성 : 일정 시간 마다 자동으로 수행되는 job
/* =========================== */
/* =========================== */
[테이블 소스코드]
/*[테이블 생성]*/
CREATE TABLE TEST_SYC_JOB
(
T_IDX VARCHAR2(5 BYTE) NOT NULL,
T_NAME VARCHAR2(50 BYTE) NOT NULL,
T_DES VARCHAR2(50 BYTE) NOT NULL,
T_DATE VARCHAR2(50 BYTE) NOT NULL
);
/*[테이블 삭제]*/
DROP TABLE TEST_SYC_JOB CASCADE CONSTRAINTS;
/*[테이블 조회]*/
SELECT * --
FROM TEST_SYC_JOB;
[프로시저 소스코드]
/* **************** [프로시져 생성 시작 부분] ***************** */
CREATE OR REPLACE PROCEDURE TEST_PRO_SYC_JOB
/*************************************************************
설명 - 1분마다 배치 수행 프로시져
---------------------------------------------------------------
생성 - edit 창에서 F9를 눌러서 쿼리 실행 시 자동 생성된다
---------------------------------------------------------------
OUT - O_MSG - 반환 결과 메시지
---------------------------------------------------------------
프로시져 호출 - EXEC TEST_PRO_SYC_JOB;
---------------------------------------------------------------
프로시져 결과 - Y : SUCCESS
N : EXCEPTION
---------------------------------------------------------------
프로시져 삭제 - DROP PROCEDURE TEST_PRO_SYC_JOB;
**************************************************************/
--AS --선택
IS --선택
/* **************** [전역변수 생성] ***************** */
M_DATE VARCHAR2 (100); --현재 날짜를 담을 변수
M_STEP VARCHAR2(100); --어느 부분에서 에러가 발생한지 확인하기 위한 변수
O_MSG VARCHAR2(100); --테이블 수행 내용에 담을 메시지 변수
/* ******************************************************** */
/* *************** [메인부분 시작 및 커서생성] **************** */
BEGIN
/* ===== [쿼리 종료 및 메시지 리턴] ====== */
M_STEP := '1'; -- 스텝 단계 지정
M_DATE := TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS');
O_MSG := 'Y : SUCCESS';
INSERT INTO TEST_SYC_JOB VALUES (M_STEP, 'TEST_PRO_SYC_JOB', O_MSG || ' ['|| M_STEP ||']', M_DATE);
COMMIT;
M_STEP := '2'; -- 스텝 단계 지정
M_DATE := TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS');
INSERT INTO TEST_SYC_JOB VALUES (M_STEP, 'TEST_PRO_SYC_JOB', O_MSG || ' ['|| M_STEP ||']', M_DATE);
COMMIT;
/* ======== [예외 발생 메시지 리턴] ======== */
EXCEPTION
WHEN NO_DATA_FOUND -- 예외 조건
THEN
BEGIN
O_MSG := 'N : ' || 'EXCEPTION' || ' [NO_DATA_FOUND]';
INSERT INTO TEST_SYC_JOB VALUES (M_STEP, 'TEST_PRO_SYC_JOB', O_MSG || ' ['|| M_STEP ||']', M_DATE);
COMMIT;
END;
WHEN OTHERS -- 예외 조건
THEN
BEGIN
O_MSG := 'N : ' || 'EXCEPTION' || ' [M_STEP := '|| M_STEP ||']';
INSERT INTO TEST_SYC_JOB VALUES (M_STEP, 'TEST_PRO_SYC_JOB', O_MSG || ' ['|| M_STEP ||']', M_DATE);
COMMIT;
END;
/* **************** [프로시져 종료 완료 부분] ***************** */
END TEST_PRO_SYC_JOB;
/
/* ******************************************************* */
[job 소스코드]
/* ******* [TEST_PRO_SYC_JOB 프로시저 JOB 배치 스케줄 설명] ******* */
/*************************************************************
[설명] : 1분마다 TEST_PRO_SYC_JOB 프로시져를 호출하는 배치 스케줄
---------------------------------------------------------------
[문법] :
DECLARE
X NUMBER;
BEGIN
begin
SYS.DBMS_JOB.SUBMIT
(
job => X
,what => 'TEST_PRO_SYC_JOB;'
,next_date => to_date('04/13/2021 12:27:36','mm/dd/yyyy hh24:mi:ss')
,interval => 'SYSDATE+1/24/60'
,no_parse => FALSE
);
:JobNumber := to_char(X);
exception
when others then
begin
raise;
end;
end;
END;
[문법 설명] :
- job : 실행시킬 job 번호 (job 번호로 다른 프로시저에서 호출될 수 있음)
- what : 실제 작업을 수행하는 PL/SQL 또는 SQL 또는 Procedure 등
- next_date : job이 초기 및 다음에 수행될 시간을 지정
- interval : job이 주기적으로 실행되는 시간을 지정
- no_parse : parse 여부를 지정, 기본값은 false 로 parse를 수행 (프로시져 실행 여부 - FALSE가 즉시 실행)
---------------------------------------------------------------
[시간 주기 설명] :
- sysdate+7 : 7일에 한번
- sysdate+1 : 하루에 한번
- sysdate+1/24 : 한 시간에 한번
- sysdate+1/24/6 : 10분에 한번
- sysdate+5/24/60 : 5분에 한번
- sysdate+1/24/60 : 1분에 한번
---------------------------------------------------------------
[JOB 등록] :
- TOAD 툴 > Schema Browser > Jobs > Create Job [주의사항 : 프로시저 인풋, 아웃풋 데이터 포함 시 에러 발생할 수 있음]
[JOB 조회] :
- SELECT * FROM USER_JOBS; [or] SELECT * FROM DBA_JOBS;
[JOB 삭제] :
DECLARE
BEGIN
-- USER_JOBS 테이블에서 JOB 컬럼에 등록된 번호 확인해야합니다
dbms_job.remove('8');
COMMIT;
END;
---------------------------------------------------------------
[등록된 JOB이 수행되지 않는 경우] :
- USER_JOBS 테이블에서 JOB 컬럼에 등록된 번호 확인해야합니다
- 정지 broken true / 재실행 broken false / run 강제 실행
DECLARE
BEGIN
DBMS_JOB.BROKEN(job, TRUE);
COMMIT;
END;
DECLARE
BEGIN
DBMS_JOB.BROKEN(job, FALSE);
COMMIT;
END;
**************************************************************/
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'OracleDB' 카테고리의 다른 글
Comments