제31장 DBMS_SCHEDULER

내용 목차

31.1. 개요
31.2. 프러시저
31.2.1. CREATE_CHAIN
31.2.2. CREATE_JOB
31.2.3. CREATE_PROGRAM
31.2.4. DEFINE_CHAIN_RULE
31.2.5. DEFINE_CHAIN_STEP
31.2.6. DISABLE
31.2.7. DROP_CHAIN
31.2.8. DROP_CHAIN_RULE
31.2.9. DROP_CHAIN_STEP
31.2.10. DROP_JOB
31.2.11. DROP_PROGRAM
31.2.12. ENABLE
31.2.13. RUN_JOB
31.2.14. SET_ATTRIBUTE
31.2.15. STOP_JOB

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

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

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

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

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

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

  • 현재 데이터베이스에 추가된 JOB은 [DBA | ALL | USER]_SCHEDULER_JOBS 뷰를 통해 확인할 수 있다. 이외에도 다음의 뷰를 지원한다.

    [DBA | ALL | USER]_SCHEDULER_PROGRAMS              
    [DBA | ALL | USER]_SCHEDULER_CHAINS
    [DBA | ALL | USER]_SCHEDULER_RUNNING_JOBS
    [DBA | ALL | USER]_SCHEDULER_STEPS
    [DBA | ALL | USER]_SCHEDULER_RULES
    [DBA | ALL | USER]_SCHEDULER_STEP_CTX
    [DBA | ALL | USER]_SCHEDULER_RULE_CTX
    

  • 시간 기반으로 스케줄링을 설정할 때, UNIX 계열 운영체제에서 사용하는 CRON expression을 사용하여 설정한다.

  • 등록된 JOB은 내부적으로 DBMS_JOB 패키지를 통해서 수행된다.

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

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

JOB을 생성하는 프러시저이다. enabled 파라미터를 TRUE로 설정하는 경우 설정한 스케줄에 따라 스케줄러에 의해 자동으로 실행된다. 하지만 disabled 상태인 경우 명시적으로 SET_ATTRIBUTE 프러시저를 통해 enabled 상태로 변경하기 전까지 실행되지 않는다.

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

  • 프로토타입

    DBMS_SCHEDULER.CREATE_JOB
    (
        job_name            IN VARCHAR2,                                                                             
        job_type            IN VARCHAR2,                                                                             
        job_action          IN VARCHAR2,                                                                           
        program_name        IN VARCHAR2 DEFAULT NULL,                                                            
        schedule_name       IN VARCHAR2 DEFAULT NULL,                                                           
        number_of_arguments IN BINARY_INTEGER DEFAULT 0,                                                  
        start_date          IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,                                              
        repeat_interval     IN VARCHAR2 DEFAULT NULL,                                                         
        event_condition     IN VARCHAR2 DEFAULT NULL,                                                         
        queue_spec          IN VARCHAR2 DEFAULT NULL,                                                              
        end_date            IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,                                                
        job_class           IN VARCHAR2 DEFAULT 'DEFAULT_JOB_CLASS',                                                
        enabled             IN BOOLEAN DEFAULT FALSE,                                                                 
        auto_drop           IN BOOLEAN DEFAULT TRUE,                                                                
        comments            IN VARCHAR2 DEFAULT NULL,                                                                
        credential_name     IN VARCHAR2 DEFAULT NULL,                                                         
        destination_name    IN VARCHAR2 DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    job_name

    생성할 JOB의 이름을 지정한다.

    다른 객체와 구분되는 이름으로 지정해야 한다.

    job_type

    생성할 JOB의 타입을 지정한다.

    지원되는 타입은 아래와 같다.

    • PSM_BLOCK: PSM 코드를 생성하는 JOB이다. JOB에 인자를 전달하는 기능은 지원하지 않으므로 number_of_arguments 파라미터는 0이 되어야 한다.

    • CHAIN: JOB의 타입이 체인일 경우 지정한다. 체인에 인자를 전달하는 기능은 지원하지 않으므로 number_of_arguments 파라미터는 0이 되어야 한다.

    job_action

    JOB이 수행할 동작을 지정한다.

    타입별로 아래와 같은 동작을 지정할 수 있다.

    • PSM_BLOCK: PSM 코드를 지정한다. 반드시 세미콜론으로 끝나야 한다.

      예를 들어 다음과 같이 설정한다.

      BEGIN my_proc(); 
      END; 

      또는

      DECLARE arg pls_integer:= 10; 
      BEGIN my_proc2(arg); 
      END;

    • CHAIN: JOB 타입이 체인일 경우, 수행할 체인 이름을 지정한다.

    program_nameJOB과 관련된 프로그램 이름을 지정한다. 현재는 타입이 체인인 경우에만 program_name을 사용한다.
    schedule_name지원되지 않는 기능이므로 값을 무시한다.
    number_of_arguments지원되지 않는 기능이므로 값을 무시한다.
    start_date

    스케줄러에 의해서 JOB을 시작할 시간을 지정한다.

    NULL인 경우 현재 시간으로 설정된다. 시스템의 상태에 따라서 시작 시간은 오차가 발생할 수 있다. repeat_interval에 지정된 식은 이 값을 참조하여 다음 수행 스케줄을 결정한다.

    repeat_interval

    JOB 수행 주기를 지정한다. NULL 값으로 지정한 경우 한 번만 수행된다.

    주기는 CRON expression 사용하여 지정할 수 있다. 예를 들어 '0-59 * * * * *' 값으로 설정한 경우 매초 수행된다.

    CRON expression은 앞에서부터 초(0-59), 분(0-59), 시간(0-23), 일(1-31), 월(1-12), 주(0-7) 순서로 작성한다.

    다음은 지원하는 특수 문자에 대한 설명이다.

    • 하이픈(-): 범위를 지정한다. 예를 들어 '0-59'는 0과 59를 포함한 사이의 값을 의미한다.

    • 애스터리스크(*): 가능한 모든 값을 의미한다. 예를 들어 초 자리에 '*'를 사용한 경우 '0-59'와 동일한 의미를 갖는다.

    • 콤마(,): 여러 값을 리스트 형태로 작성할 때 사용한다. 예를 들어 1월, 4월, 7월, 10월로 설정하려는 경우 '1, 4, 7, 10'로 작성한다.

    • 슬래시(/): 지정한 리스트에서 건너뛸 크기를 지정한다. 예를 들어 '1-12/3'은 '1, 4, 7, 10'과 동일한 의미를 갖는다. 하지만 '1/3'의 경우는 값의 범위가 '1' 하나 뿐이기 때문에 '1'과 동일한 의미를 갖는 점에 유의한다. 또한 애스터리스크(*)와 슬래시(/)를 동시에 사용한 경우 슬래시(/)는 무시된다.

    event_condition지원되지 않는 기능이므로 값을 무시한다.
    queue_spec지원되지 않는 기능이므로 값을 무시한다.
    end_date지원되지 않는 기능이므로 값을 무시한다.
    job_class지원되지 않는 기능이므로 값을 무시한다.
    enabled

    JOB을 생성할 때 enabled 상태를 지정한다.

    ENABLE, DISABLE 프러시저를 통해 값을 변경할 수 있다.

    (TRUE/FALSE, 기본값: FALSE)

    auto_drop지원되지 않는 기능이므로 값을 무시한다.
    commentsJOB에 대한 주석을 지정한다.
    credential_name지원되지 않는 기능이므로 값을 무시한다.
    destination_name지원되지 않는 기능이므로 값을 무시한다.
  • 예제

    BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
          job_name        => 'job_name',
          job_type        => 'PSM_BLOCK',
          job_action      => 'begin my_proc; end;',
          start_date      => SYSTIMESTAMP,
          repeat_interval => '30 0 1-3 * * *',
          enabled         => TRUE,
          comments        => 'Job defined entirely by the CREATE JOB procedure.');
    END;
    /

기존에 생성된 체인에서 사용할 룰을 지정할 때 사용하는 프러시저이다. condition과 action의 짝으로 이루어지며, condition은 SQL 구문의 WHERE 절에 해당하는 문법을 사용하며, action은 START, END 명령과 수행할 스텝을 콤마(,)로 구분하여 리스트로 지정한다. JOB 체인 수행 중 condition이 만족되면 해당 action이 수행된다.

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

  • 프로토타입

    DBMS_SCHEDULER.DEFINE_CHAIN_RULE
    (
        chain_name              IN VARCHAR2,
        condition               IN VARCHAR2,
        action                  IN VARCHAR2,
        rule_name               IN VARCHAR2 DEFAULT NULL,
        comments                IN VARCHAR2 DEFAULT NULL
    );
  • 파라미터

    파라미터설명
    chain_name룰을 적용할 체인 이름을 지정한다.
    condition

    스텝 속성을 조건문 형식으로 지정하여 JOB 체인을 구성하기 위해 사용한다.

    Boolean expression으로 TRUE로 평가되는 식일 때만 action이 수행된다. 모든 체인은 체인의 시작을 위해서 반드시 TRUE 평가되는 룰을 가져야 한다. 예를 들어 condition은 SQL WHERE clause syntax를 지원하므로 '1=1' 형태의 식을 지정한다.

    condition을 SQL의 형태로 사용할려면 select statement와 where 절이 와야하는데, 이 경우 chain step attribute(체인 스텝 속성)를 bind variable로 사용할 수 있는데, 사용법은 step_name.attribute와 같다.

    attribute의 종류에는 completed와 state가 있다.

    state attribute는 'STARTED', 'RUNNING', 'SUCCEEDED', 'FAILED' 값을 가질 수 있다. state attribute가 이 값 중 하나의 값을 갖는다면, completed attribute는 'TRUE'이고, 그렇지 않으면 completed 값은 'FALSE'이다.

    action

    RULE이 TRUE일 때 수행할 동작을 지정한다.

    다음의 문법을 지원한다.

    •  START step_1[, step_2 ..] 

      START step_1[, step_2 ..]는 조건이 참일 때 리스트 형태로 지정된 스텝을 수행한다.

    •  END 

      END는 조건이 참일 때 체인을 종료한다.

    rule_name생성될 룰의 이름이다.
    comments룰에 대한 comment이다.
  • 예제

    BEGIN
        /* 체인을 시작하기 위한 RULE을 생성한다. */
        DBMS_SCHEDULER.DEFINE_CHAIN_RULE('chain_name',
                                         '1=1',
                                         'start step1',
                                         'rule1');
    
        /* step3이 종료되면, 체인을 종료한다. */
        DBMS_SCHEDULER.DEFINE_CHAIN_RULE('chain_name',
                                         'step3.completed =''TRUE''',
                                         'end',
                                         'rule2');
    
        /* step1이 성공하면 step3을 수행한다. */ 
        DBMS_SCHEDULER.DEFINE_CHAIN_RULE('chain_name',
                                         'step1.state=''SUCCEEDED''',
                                         'start step3',
                                         'rule3');
    END; 
    /