투케이2K

124. (Oracle/오라클) JOB 스케줄링 수행 배치 프로그램 만들기 실시 - 일정 시간 마다 자동 수행 본문

OracleDB

124. (Oracle/오라클) JOB 스케줄링 수행 배치 프로그램 만들기 실시 - 일정 시간 마다 자동 수행

투케이2K 2021. 4. 13. 13:31

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : 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;
            
**************************************************************/

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

반응형
Comments