제9장 DBMS_JOB

내용 목차

9.1. 개요
9.2. 프러시저
9.2.1. BROKEN
9.2.2. CHANGE
9.2.3. INTERVAL
9.2.4. NEXT_DATE
9.2.5. REMOVE
9.2.6. RUN
9.2.7. SUBMIT
9.2.8. WHAT

본 장에서는 DBMS_JOB 패키지의 기본 개념과 패키지 내의 프러시저를 사용하는 방법을 설명한다.

9.1. 개요

Tibero에서는 주기적으로 데이터베이스에 추가된 JOB을 검사하여, 사용자가 설정한 시각이 되면 해당하는 JOB을 실행한다.

DBMS_JOB은 PSM에서 사용 가능한 문장을 JOB으로 등록하고, 이 JOB을 실행할 수 있는 연산을 제공하는 패키지이다. DBMS_JOB 패키지 내의 프러시저를 이용하여, JOB을 데이터베이스에 추가하고 바로 실행하거나 정해진 시각에 실행되도록 설정할 수 있다.

다음은 DBMS_JOB 패키지의 특징이다.

  • DBMS_JOB 패키지의 사용할 때 DBA 권한은 필요하지 않으며, 추가된 JOB은 오직 JOB의 소유자만 실행하거나 변경할 수 있다.

  • 특정 인스턴스(instance)에서 JOB을 실행하도록 지정하는 기능은 지원하지 않는다. 따라서 파라미터에 입력 값으로 instance와 force parameter가 입력될 경우 무시하게 된다.

  • JOB을 추가 또는 변경하는 경우 커밋을 실행하지 않아도 자동으로 커밋되며, JOB 내에서 실행한 작업도 자동으로 커밋된다.

  • 현재 데이터베이스에 추가된 JOB은 DBA_JOBS, ALL_JOBS, USER_JOBS 뷰를 통해 확인할 수 있다.

  • JOB 실행이 실패한 경우에는 재실행되며, 16번 실패하게 되면 해당 JOB은 broken 상태가 된다.

  • 실행 중인 JOB을 정지할 수 있는 기능은 제공하지 않는다.

9.2. 프러시저

본 절에서는 DBMS_JOB 패키지에서 제공하는 프러시저를 알파벳 순으로 설명한다.

9.2.1. BROKEN

저장된 JOB의 상태를 정상 또는 broken 상태로 설정하는 프러시저이다. broken되어 있던 JOB을 정상 상태로 만들 경우 JOB의 다음 실행 시각을 설정할 수 있다.

BROKEN 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.BROKEN
    (
            job         IN   BINARY_INTEGER,
            broken      IN   BOOLEAN,
            next_date   IN   DATE DEFAULT SYSDATE
    ); 
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    broken
    • TRUE: JOB이 broken된 경우

    • FALSE: 정상 상태인 경우

    next_date
    • broken이 TRUE인 경우 무시한다.

    • broken이 FALSE인 경우 다음 실행 시각을 설정한다.

  • 예제

    BEGIN
        /* broken된 JOB을 정상 상태로 변경하고, 한 시간 뒤 실행하도록 수정한다. */
        DBMS_JOB.BROKEN(100, false, sysdate + 1/24); 
    END; 
    /

9.2.2. CHANGE

저장된 JOB의 필드를 변경하는 프러시저이다.

CHANGE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    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
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    what실행할 PL/SQL 프러시저 또는 PSM 문장의 시퀀스이다.
    next_dateJOB을 실행할 다음 시각이다.
    interval다음 JOB이 실행될 시각을 계산하기 위한 연산식이다. 자세한 내용은 “9.2.3. INTERVAL”을 참고한다.
    instance지원되지 않는 기능이므로 값을 무시한다.
    force지원되지 않는 기능이므로 값을 무시한다.
  • 예제

    BEGIN
        DBMS_JOB.CHANGE(100, null, null, 'sysdate + 1'); 
    END; 
    /

9.2.3. INTERVAL

JOB을 얼마나 자주 실행할지 정하는 파라미터를 변경하는 프러시저이다.

INTERVAL 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.INTERVAL
    (
        job         IN   BINARY_INTEGER,
        interval    IN   VARCHAR2
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    interval

    다음에 JOB을 실행할 시각인 next_date를 업데이트하기 위한 연산식이다.

    NULL 또는 날짜형으로 evaluate될 수 있는 연산식의 문자열이어야 한다. (최소 초 단위까지 가능)

    JOB을 실행하기 전에 evaluate된다. JOB이 성공적으로 실행되고, interval의 계산 값이 NULL이면 해당 JOB은 삭제된다.

    다음은 interval 파라미터의 사용 예이다.

    • 예1)

      'sysdate + 1' 

      하루에 한 번씩 실행한다.

    • 예2)

      'next_day(sysdate,''MONDAY'')' 

      매주 월요일에 실행한다.

    • 'null' 

      한 번만 실행한다.

  • 예제

    BEGIN
        /* 하루에 한 번씩 실행한다. */
        DBMS_JOB.INTERVAL(100, 'sysdate + 1'); 
    END; 
    /

9.2.4. NEXT_DATE

JOB이 스케줄되어 자동으로 실행될 시각을 변경하는 프러시저이다. 실행된 후에는 interval 값에 의해 업데이트된다.

NEXT_DATE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.NEXT_DATE
    (
        job         IN   BINARY_INTEGER,
        next_date   IN   DATE
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    next_dateJOB이 스케줄되어 실행될 시각이다.
  • 예제

    BEGIN
        /* 10분 후에 실행하도록 변경한다. */
        DBMS_JOB.NEXT_DATE(100, sysdate + 10/24/60); 
    END; 
    /

9.2.5. REMOVE

데이터베이스에 추가된 JOB을 삭제하는 프러시저이다.

REMOVE 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.REMOVE
    (
        job         IN   BINARY_INTEGER
    );
  • 파라미터

    파라미터설명
    job삭제할 JOB의 번호이다.
  • 예제

    BEGIN
        DBMS_JOB.REMOVE(100);
    END; 
    /

9.2.6. RUN

JOB을 현재 세션에서 즉시 실행하는 프러시저이다. JOB이 broken되어 있어도 실행하고, 실행에 성공한 경우 JOB을 정상 상태로 변경한다.

RUN 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.RUN
    (
        job      IN   BINARY_INTEGER,
        force    IN   BOOLEAN DEFAULT FALSE
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    force지원되지 않는 기능이므로 값을 무시한다.
  • 예제

    BEGIN
        DBMS_JOB.RUN(100); 
    END; 
    /

9.2.7. SUBMIT

데이터베이스에 새로운 JOB을 추가하는 프러시저이다.

SUBMIT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    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 NULL,
        force        IN   BOOLEAN DEFAULT FALSE
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    what실행할 PL/SQL 프러시저 또는 PSM 문장의 시퀀스이다.
    next_dateJOB을 다음에 실행할 시각이다.
    interval다음 JOB이 실행될 시각을 계산하기 위한 연산식이다. 자세한 내용은 “9.2.3. INTERVAL”을 참고한다.
    no_parse
    • TRUE: submit을 할 때 JOB을 파싱하지 않고, JOB이 실행될 때 파싱을 하게 된다. 따라서 파싱의 실패 여부가 최초 실행 시점에 보고된다.

    • FALSE: JOB에 관련된 프러시저를 미리 파싱한다.

    instance지원되지 않는 기능이므로 값을 무시한다.
    force지원되지 않는 기능이므로 값을 무시한다.
  • 예제

    DECLARE
        job_no number;
    BEGIN
        DBMS_JOB.SUBMIT(job_no,'dbms_output.put_line(''ok'');', SYSDATE, 
                        'SYSDATE + 1');
    END;
    /

9.2.8. WHAT

JOB이 실행하는 작업을 변경하는 프러시저이다.

WHAT 프러시저의 세부 내용은 다음과 같다.

  • 프로토타입

    DBMS_JOB.WHAT
    (
        job      IN   BINARY_INTEGER,
        WHAT     IN   VARCHAR2
    );
  • 파라미터

    파라미터설명
    job실행할 JOB의 번호이다.
    what

    실행할 PL/SQL 프러시저 또는 PSM 문장의 시퀀스이다. 항상 세미콜론(;)으로 끝나는 문자열이 와야 한다.

    예를 들어 다음과 같은 문자열이 올 수 있다.

    • 예1)

      psm_proc(''abc'', 10);
    • 예2)

      dbms_output.put_line(''ok'');
    • 예3)

      declare x number; 
      begin x := x + 1;
      dbms_outout.put_line(x); 
      end;
  • 예제

    BEGIN
        /* job번호가 100인 job을 psm_proc 프러시저 호출로 대체한다. */
        DBMS_JOB.WHAT(100, 'psm_proc(''abc'', 10);'); 
    END; 
    /