내용 목차
본 장에서는 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 체인을 생성하는 프러시저이다. 체인은 생성할 때 항상 disabled 상태이기 때문에 사용하기 전에 명시적으로 ENABLE 프러시저를 통해 enabled 상태로 변경해야 한다.
CREATE_CHAIN 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.CREATE_CHAIN ( chain_name IN VARCHAR2, rule_set_name IN VARCHAR2 DEFAULT NULL, evaluation_interval IN INTERVAL DAY TO SECOND DEFAULT NULL, comments IN VARCHAR2 DEFAULT NULL );
파라미터
파라미터 | 설명 |
---|---|
chain_name | 생성할 체인의 이름이다. 이미 생성된 다른 오프젝트 이름과 겹치지 않아야 한다. |
rule_set_name | 일반적으로 직접 rule_set_name을 지정할 필요가 없고 DEFINE_CHAIN_RULE 및 DROP_CHAIN_RULE 프러시저를 통해 추가 및 삭제한다. 현재 사용하지 않는 파라미터이다. |
evaluation_interval | NULL 값인 경우, JOB이 시작하거나 STEP이 종료한 경우에만 룰에 대한 재평가를 실시한다. 현재 NULL 값만 지원한다. |
comments | 체인의 목적 등을 부가적으로 서술하기 위한 파라미터이다. |
예제
BEGIN /* chain_name이라는 이름을 가진 체인을 생성한다. */ DBMS_SCHEDULER.CREATE_CHAIN(chain_name => 'chain_name', rule_set_name => NULL, evaluation_interval => NULL, comments => 'my first job chain'); END; /
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의 타입을 지정한다. 지원되는 타입은 아래와 같다.
|
job_action | JOB이 수행할 동작을 지정한다. 타입별로 아래와 같은 동작을 지정할 수 있다.
|
program_name | JOB과 관련된 프로그램 이름을 지정한다. 현재는 타입이 체인인 경우에만 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) 순서로 작성한다. 다음은 지원하는 특수 문자에 대한 설명이다.
|
event_condition | 지원되지 않는 기능이므로 값을 무시한다. |
queue_spec | 지원되지 않는 기능이므로 값을 무시한다. |
end_date | 지원되지 않는 기능이므로 값을 무시한다. |
job_class | 지원되지 않는 기능이므로 값을 무시한다. |
enabled | JOB을 생성할 때 enabled 상태를 지정한다. ENABLE, DISABLE 프러시저를 통해 값을 변경할 수 있다. (TRUE/FALSE, 기본값: FALSE) |
auto_drop | 지원되지 않는 기능이므로 값을 무시한다. |
comments | JOB에 대한 주석을 지정한다. |
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; /
프로그램을 생성하는 프러시저이다. 현재는 JOB 체인을 생성할 때만 사용된다.
CREATE_PROGRAM 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.INTERVAL ( program_name IN VARCHAR2, program_type IN VARCHAR2, program_action IN VARCHAR2, number_of_arguments IN PLS_INTEGER DEFAULT 0, enabled IN BOOLEAN DEFAULT FALSE, comments IN VARCHAR2 DEFAULT NULL); );
파라미터
파라미터 | 설명 |
---|---|
program_name | 생성할 프로그램의 이름을 지정한다. |
program_type | 생성할 프로그램의 타입을 지정한다. 현재는 'PSM_BLOCK' 타입만 지원한다. |
program_action | 프로그램이 수행할 동작을 지정한다. 타입별로 아래와 같은 동작을 지정할 수 있다.
|
number_of_arguments | 지원되지 않는 기능이므로 값을 무시한다. |
enabled | 프로그램을 생성할 때 enabled 상태를 지정한다. ENABLE, DISABLE 프러시저를 통해 값을 변경할 수 있다. (TRUE/FALSE, 기본값: FALSE) |
comments | 프로그램에 대한 주석을 지정한다. |
예제
BEGIN DBMS_SCHEDULER.CREATE_PROGRAM(program_name => 'program_name', program_type => 'PSM_BLOCK', program_action => 'my_job;'); 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일 때 수행할 동작을 지정한다. 다음의 문법을 지원한다.
|
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; /
기존의 생성된 체인에 스텝을 지정할 때 사용하는 프러시저이다.
DEFINE_CHAIN_STEP 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.DEFINE_CHAIN_STEP ( chain_name IN VARCHAR2, step_name IN VARCHAR2, program_name IN VARCHAR2 );
파라미터
파라미터 | 설명 |
---|---|
chain_name | 스텝을 정의할 체인 이름을 지정한다. |
step_name | 스텝 이름을 지정한다. |
program_name | 스텝에서 수행할 프로그램을 지정한다. |
예제
BEGIN DBMS_SCHEDULER.DEFINE_CHAIN_STEP('chain_name', 'step1', 'program_name'); END; /
이 프러시저는 program, job, chain을 disable하기 위해 사용한다. 각 객체의 enabled attribute를 'FALSE'로 설정한다.
프로토타입
DBMS_SCHEDULER.DISABLE ( name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE, commit_semantics IN VARCHAR2 DEFAULT 'STOP_ON_FIRST_ERROR' );
파라미터
파라미터 | 설명 |
---|---|
name | 속성을 변경할 객체의 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
commit_semantics | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DISABLE('my_job'); END; /
데이터베이스에서 기존 체인을 삭제하는 프러시저이다.
DROP_CHAIN 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.DROP_CHAIN ( chain_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
chain_name | 삭제할 체인의 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DROP_CHAIN('my_chain'); END; /
데이터베이스에서 기존 체인에서 룰을 삭제하는 프러시저이다.
DROP_CHAIN_RULE 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.DROP_CHAIN_RULE ( chain_name IN VARCHAR2, rule_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
chain_name | 적용할 체인의 이름을 지정한다. |
rule_name | 삭제할 룰의 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DROP_CHAIN_RULE('my_chain', 'my_rule1'); END; /
데이터베이스에서 기존 체인 스텝을 삭제하는 프러시저이다.
DROP_CHAIN_STEP 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.DROP_CHAIN_STEP ( chain_name IN VARCHAR2, step_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
chain_name | 적용할 체인의 이름을 지정한다. |
step_name | 삭제할 스텝의 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DROP_CHAIN_STEP('my_chain', 'my_step1'); END; /
데이터베이스에서 기존 JOB을 삭제하는 프러시저이다.
프로토타입
DBMS_SCHEDULER.DROP_JOB ( job_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE, defer IN BOOLEAN DEFAULT FALSE, commit_semantics IN VARCHAR2 DEFAULT 'STOP_ON_FIRST_ERROR' );
파라미터
파라미터 | 설명 |
---|---|
job_name | 삭제할 JOB의 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
defer | 지원되지 않는 기능이므로 값을 무시한다. |
commit_semantics | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DROP_JOB('my_job'); END; /
데이터베이스에서 기존 프로그램을 삭제하는 프러시저이다.
DROP_PROGRAM 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.DROP_PROGRAM ( program_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE );
파라미터
파라미터 | 설명 |
---|---|
program_name | 삭제할 프로그램 이름을 지정한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.DROP_PROGRAM('my_program'); END; /
이 프러시저는 program, job, chain을 enable하기 위해 사용한다. 각 객체의 enabled attribute를 'TRUE'로 설정한다.
프로토타입
DBMS_SCHEDULER.ENABLE ( name IN VARCHAR2, commit_semantics IN VARCHAR2 DEFAULT 'STOP_ON_FIRST_ERROR' );
파라미터
파라미터 | 설명 |
---|---|
name | 속성을 변경할 객체의 이름을 지정한다. |
commit_semantics | 지원되지 않는 기능이므로 값을 무시한다. |
예제
BEGIN DBMS_SCHEDULER.ENABLE('my_job'); END; /
일반적으로 JOB이 enabled 상태이면 스케줄러에 의해서 자동으로 수행되지만, 이와는 별개로 수동으로 JOB을 수행하기 위한 프러시저이다.
프로토타입
DBMS_SCHEDULER.RUN_JOB ( job_name IN VARCHAR2, use_current_session IN BOOLEAN DEFAULT TRUE );
파라미터
파라미터 | 설명 |
---|---|
job_name | 수행할 JOB 이름을 지정한다. |
use_current_session | 지원되지 않는 기능이므로 값을 무시한다. 항상 현재 세션으로 수행된다. |
예제
BEGIN DBMS_SCHEDULER.RUN_JOB('my_job'); END; /
job, program, chain 객체의 속성을 변경하기 위한 프러시저이다.
SET_ATTRIBUTE 프러시저의 세부 내용은 다음과 같다.
프로토타입
DBMS_SCHEDULER.SET_ATTRIBUTE ( name IN VARCHAR2, attribute IN VARCHAR2, value IN {BINARY_INTEGER|VARCHAR2} );
파라미터
파라미터 | 설명 |
---|---|
name | attribute를 변경할 객체의 이름을 지정한다. |
attribute | 변경할 attribute를 지정한다. 다음의 attribute를 지원한다.
|
value | 변경할 값을 지정한다. |
예제
BEGIN /* JOB을 수행할 TAC node instance_id를 0으로(any instance) 설정한다. */ DBMS_SCHEDULER.SET_ATTRIBUTE('my_job', 'INSTANCE_ID', 0); END; /