ORACLE에서 주기적으로 작업을 실행하고 작업 큐 내의 작업들을 관리하는데, DBMS_JOB 패키지가 사용됩니다. Oracle 10g 부터는 좀더 확장된 기능을 가진 DBMS_SCHEDULER 패키지가 제공됩니다. DBMS_JOB 패키지도 그대로 제공됩니다. 이번에는 DBMS_JOB 패키지에 대해서 알아봅니다.
DBMS_JOB 패키지를 사용하는데 특별한 시스템 권한이 요구되지 않습니다. 작업(Job)은 작업의 소유자가 아닌 다른 사용자가 수정 또는 삭제 할 수 없습니다. Job 으로 실행할 프로시저(Procedure)자신이 소유자가 아니더라도 실행(Execute)권한이 있으면 작업으로 실행시킬 수 있습니다.
주의해야할 점은 작업이 시작되어서 실행되는 중에 작업을 중지시킬 수 있는 방법은 없다는 것입니다.
Oracle RAC(Real Application Clusters)가 사용중인 환경에서 DBMS_JOB은 작업들이 여러 인스턴스에서 실행되는 것을 지원합니다. 기본적으로는 작업들은 어떤 인스턴스에서도 실행될 수 있습니다. 그러나 단 하나의 단일 인스턴스가 작업을 실행할 것입니다.
1. 작업을 등록합니다.
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 : 실행할 PL/SQL 프로시저 입니다. what 파라미터는 세미콜론(;)으로 끝나야 합니다.
- next_date : 작업이 실행될 다음 시간 입니다. 기본값은 SYSDATE 입니다.
- interval : 다음에 작업이 실행될 시간을 계산하는 날짜 함수 입니다. 기본값은 NULL 입니다. interval은 다음 시간값이나 NULL이어야 합니다. 이 값은 VARCHAR2 타입이고 작은 따옴표로 둘러싸여져야 합니다.
- no_parse : 만약 NO_PARSE가 FALSE로 설정(이것이 기본값입니다.)되면, 오라클은 job과 연관된 프로시저를 파싱합니다. 만약 NO_PARSE가 TRUE로 설정되면, 오라클은 job과 연관된 프로시저를 job이 처음 실행될 때 파싱합니다. 예를 들어, 만약 job과 관련된 테이블이 생성되기 전에 job 을 submit 하기를 원한다면 NO_PARSE를 TRUE 로 설정하면 됩니다.
- instance : 작업이 제출되어 졌을때, 어떤 instance 가 작업을 실행할지 지정합니다.(여기서 instance는 클러스터링된 컴퓨터들 중의 하나 입니다.)
- force : TRUE인 경우 모든 양의 정수는 작업 인스턴스로 허용됩니다. 이 값이 FALSE이면(FASE가 기본값 입니다.) 지정된 인스턴스가 실행되고 있어야 합니다. 그렇지 않으면 예외가 발생합니다.
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(
:jobno,
'process_job();',
SYSDATE,
'SYSDATE + 1');
COMMIT;
END;
/
Statement processed.
print jobno
JOBNO
----------
14144
2. JOB 조회
SELECT JOB, WHAT, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM USER_JOBS;
3. BROKEN 프로시저 : 작업을 비활성화 하거나 다시 활성화 합니다.
BEGIN
DBMS_JOB.BROKEN(1, FALSE); -- 비활성화
COMMIT;
END;
/
4. 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 );
BEGIN
DBMS_JOB.CHANGE(14144, null, null, 'sysdate+3');
COMMIT;
END;
5. INSTANCE 프로시저 : 실행될 인스턴스를 할당합니다.
DBMS_JOB.INSTANCE (
job IN BINARY_INTEGER,
instance IN BINARY_INTEGER,
force IN BOOLEAN DEFAULT FALSE
);
6. INTERVAL 프로시저 : 작업이 실행될 간격을 수정합니다.
DBMS_JOB.INTERVAL (
job IN BINARY_INTEGER,
interval IN VARCHAR2
);
7. NEXT_DATE 프로시저 : 다음 실행 시간을 수정합니다.
DBMS_JOB.NEXT_DATE (job IN BINARY_INTEGER, next_date IN DATE);
8. REMOVE 프로시저 : 작업 큐에서 작업을 제거합니다.
BEGIN
DBMS_JOB.REMOVE(2);
COMMIT;
END;
/
9. RUN 프로시저 : 작업을 강제 실행 합니다.
BEGIN
DBMS_JOB.RUN(2);
COMMIT;
END;
/
10. USER_EXPORT 프로시저 : 지정된 작업을 내보내거나 지정된 작업과 인스턴스 선호도로 내보냅니다.
declare
vstring varchar2(4000);
begin
dbms_job.user_export (job => 7748, mycall => vstring);
dbms_output.put_line (vstring);
end;
11. WHAT 프로시저 : 작업이 실행할 프로시저를 변경합니다.
execute dbms_job.what(100,'my_package.proc1;');
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
오라클 계층 쿼리(Hierarchical Query)의 사용법 (0) | 2018.04.09 |
---|---|
Oracle Original Export and Import(exp and imp) (0) | 2018.04.09 |
SQLyog 사용법 (2) | 2018.04.03 |
MySQL 명령행 클라이언트 및 관리 명령어 (2) | 2018.04.03 |
SQLyog - MySQL 관리툴 설치하기 (0) | 2018.04.02 |