갈루아의 반서재

 dbms_job.submit 을 통해 일정 간격이나 특정 시간대에 프로시져를 실행할 수 있다.

 

1. 현재 돌아가고 있는 잡을 확인합니다.

SELECT * FROM DBA_JOBS;

 

2. 다음과 같이 Job 을 등록할 수 있습니다.

1) 코드 예시

DECLARE

 

  X NUMBER; 

 

BEGIN 

 

  SYS.DBMS_JOB.SUBMIT 

 

    ( X  

 Job 넘버 (식별자)

     ,'SMIS.proc_daily_stat_ins;' 

 주기적으로 실행할 프로시져 또는 패키지이름

     ,to_date('05-09-2014 13:08:00','dd/mm/yyyy hh24:mi:ss') 

 다음 번 Job 수행시간

     ,'SYSDATE + 30/1440' 

 Job 수행 주기

     ,TRUE 

 

    ); 

 

  SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x)); END;

 

 

 

2) Job 수행 간격에 대해 좀 더 살펴보면

 SYSDATE + 7

 7일에 한 번

 SYSDATE + 1

 하루에 한 번

 SYSDATE + 1/24

 한 시간(하루는 24시간)에 한 번

 SYSDATE + 1/1440

 1분(하루는 24*60=1,440분)에 한번

 SYSDATE + 1/86400

 1초(하루는 24*60*60=86,400초)에 한 번

 

 

그리고  trunc(SYSDATE, 'MI') + 1/24  와 같이 trunc 를 쓰는 이유는 정각에 Job을 수행하기 위해서이다. 만약 최초 작업이 자정에 이루어졌고 인터벌을 SYSDATE + 1/24 와 같이 준다고 해도 실제로는 00:00:00, 01:00:00, 02:00:00 에 작업이 진행되어야 하지만 실제로는 01:00:02, 02:00:05 와 같이 수행시간이 몇 초씩 늦어지게 된다. 이런 경우를 피하기 위해 trunc 함수를 이용해 분 단위에서 자르게 되는 것이다.

 

3. Job 의 변경 및 제거

1) 변경

BEGIN
DBMS_JOB.CHANGE(46, NULL, to_date('05-09-2014 12:50:00','dd/mm/yyyy hh24:mi:ss'), 'SYSDATE + 1/144');
END;
/

                  
2) 제거

BEGIN
DBMS_JOB.REMOVE(45);
END;
/