본문 바로가기

인프라/데이터 베이스

DBMS_JOB.SUBMIT

JOB을 등록할 때 사용

 

DBMS_JOB.SUBMIT(
   job       OUT    BINARY_INTEGER,
   what      IN     VARCHAR2, next_date IN DATE DEFAULT SYSDATE
   interval  IN     VARCHAR2 DEFAULT 'NULL',
   no_parse  IN     BOOLEAN DEFAULT FALSE,
   instance  IN     BINARY_INTEGER DEFAULT ANY_INSTANCE,
   force     IN     BOOLEAN DEFAULT FALSE);

 

- job : 잡 번호
- what : 실행할 SQL이나 PL/SQL 프로시저 (실행할 프로그램)

            세미콜론(;)으로 끝나야 함
- next_date : 작업이 실행될 다음 시간

                  interval값에 따라 업데이트 됨

                  기본값 SYSDATE

- interval : 작업실행 주기

               기본값 NULL

               문자열 형태 (VARCHAR2 타입) 작은 따옴표로 감싸야 함

               이전 작업이 끝난 시점으로부터 interval을 계산
- no_parse :
- instance : 어떤 instance 가 작업을 수행할지 지정

                기본값 0 : ANY INSTANCE

                0이면 버전별로 적용 내용이 다름

                10g   : job이 최초에 생성된 instance에서 수행

                11g~ : 일반적 가장 최근에 job이 수행되었던 instance에서 job이 수행

                          node에 부하가 아~주 큰 경우 instance의 부하에 따라 작업 instance 선택

- force : TRUE면 instance에 설정한 번호가 음수나 NULL일 경우 ORA-23319 error 발생

                                                        모든 양의 정수는 instance값으로 허용

            FALSE면 없는 인스턴스 번호에 대해서는 ORA-23428 error발생

            기본값 FALSE

 

--JOB중지
EXEC DBMS_JOB.BROKEN(JOB번호, TRUE);
COMMIT;

--JOB실행
 EXEC DBMS_JOB.BROKEN(JOB번호, FALSE, 다음수행 시간);
 EXEC DBMS_JOB.BROKEN(JOB번호, FALSE, sysdate + 1/24);
 COMMIT;

 

※ JOB이 실행되고 interval 시간이 지났는데 아직 이전 작업이 종료가 되지 않았다면?

DBMS_JOB을 사용하는 경우
현재 수행중인 JOB이 종료된 이후 interval time에 따라 다음 수행시간이 결정됨
The starting time for the next execution is determined when the current jobs is finished. If you specify an interval as SYSDATE+30/86400 then it does not mean: "The job runs every 30 seconds.
It means: "The next jobs starts 30 seconds after the previous job has been finished."
DBMS_SCHEDULER를 사용하는 경우
JOB이 수행된 시점으로부터 다음 수행시간이 결정됨
만약 interval로 설정된 시간안에 작업이 끝나지 않았으면 다음 작업은 대기상태로 있다가 앞 작업이 끝나면 바로 수행Immediately after a job starts, the repeat_interval (e.g. FREQ=SECONDLY;INTERVAL=30) is evaluated to determine the next scheduled execution time of the job. While this might arrive while the job is still running, a new instance of the job does not start until the current one completes. See About Setting the Repeat Interval
So it means: If a jobs last longer than 30 seconds then the new job will start immediately after the previous job has been finished.
※ stackoverflow.com/questions/56263769/what-happens-when-a-procedure-executed-by-a-job-is-not-finished-when-is-time-for