DB에서 정기적으로 실행해야 하는 경우가 있습니다.
로그를 쌓는다거나 지표를 만들기 위한 쿼리가 있으면 linux의 crontab과 같이 잡을 생성하여 관리할 수 있습니다.
본 포스팅은 tibero를 기반으로 작성했으나 거의 모든 DBMS는 job을 비슷한 형태로 제공하므로 하나의 사용방법을 익히면
다른 DBMS에서도 금방 사용할 수 있습니다.
개요
DBMS_JOB은 PSM에서 사용 가능한 쿼리를 JOB에 등록하여 주기적으로 실행 할 수 있습니다.
- DBMS_JOB 패키지를 사용할 때 DBA 권한은 필요하지 않고 추가된 JOB은 오직 JOB 소유자만 실행하거나 변경할 수 있습니다.
- 특정 인스턴스에서 JOB을 실행하지 않도록 지정하는 기능은 지원하지 않습니다.
- JOB을 추가하거나 변경하는 경우 자동으로 커밋됩니다.
- 추가 된 JOB은 DBA_JOBS, ALL_JOBS, USER_JOBS 뷰로 확인할 수 있습니다.
- 실행중인 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_date | JOB을 다음에 실행할 시각이다. |
interval | 다음 JOB이 실행될 시각을 계산하기 위한 연산식이다. 자세한 내용은 “9.2.3. INTERVAL”을 참고한다. |
no_parse |
|
instance | 지원되지 않는 기능이므로 값을 무시한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
사용방법
DECLARE
job_no number;
BEGIN
DBMS_JOB.SUBMIT(job_no,'dbms_output.put_line(''ok'');', SYSDATE,
'SYSDATE + 1');
END;
/
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_date | JOB을 실행할 다음 시각이다. |
interval | 다음 JOB이 실행될 시각을 계산하기 위한 연산식이다. 자세한 내용은 “9.2.3. INTERVAL”을 참고한다. |
instance | 지원되지 않는 기능이므로 값을 무시한다. |
force | 지원되지 않는 기능이므로 값을 무시한다. |
사용 방법
BEGIN
DBMS_JOB.CHANGE(100, null, null, 'sysdate + 1');
END;
/
날짜 계산 예시
Description |
Date Expression |
Now |
SYSDATE |
Tomorrow/ next day |
SYSDATE + 1 |
Seve days from now |
SYSDATE + 7 |
One hour from now |
SYSDATE + 1/24 |
Three hours from now |
SYSDATE + 3/24 |
An half hour from now |
SYSDATE + 1/48 |
10 minutes from now |
SYSDATE + 10/1440 |
30 seconds from now |
SYSDATE + 30/86400 |
Tomorrow at 12 midnight |
TRUNC(SYSDATE + 1) |
Tomorrow at 8 AM |
TRUNC(SYSDATE + 1) + 8/24 |
Next Monday at 12:00 noon |
NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+12/24 |
First day of the month at 12 midnight |
TRUNC(LAST_DAY(SYSDATE)+1) |
The next Monday, Wendesday or Friday at 9 a.m |
TRUNC(LEAST(NEXT_DAY(sysdate,''MONDAY'' ), NEXT_DAY(sysdate,''WEDNESDAY''), NEXT_DAY(sysdate,''FRIDAY'' ))) + (9/24) |
간단한 예제
job 조회
/* JOB 조회*/
SELECT * FROM USER_JOBS;
job 생성
/* JOB 생성 */
DECLARE
JOB_NO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(JOB_NO,'DBMS_OUTPUT.PUT_LINE(''OK'');', SYSDATE,'SYSDATE + 1');
END;
job 삭제
/* JOB 삭제 */
EXECUTE DBMS_JOB.REMOVE(1);
delete from USER_JOBS where job = '1'
1분마다 동작하는 job 설정
DECLARE
job_no number;
BEGIN
DBMS_JOB.SUBMIT( job_no, 'test();', SYSDATE, 'SYSDATE+1/1440');
END;
'개발(합니다) > DB' 카테고리의 다른 글
[DB] 식별 관계와 비식별 관계 (0) | 2021.06.03 |
---|---|
[liquibase] DB에서 리퀴베이스 리버스(revers) 문법(추출)만들기(generateChangeLog ) (0) | 2021.05.13 |
[DB] extract을 이용해 timestamp를 비교 및 일,시,분,초 추출하기 (0) | 2021.03.29 |
[DB] 테이블 스페이스, 테이블, 컬럼 정보 조회하기(pg, mysql, oracle, tibero) (0) | 2021.02.26 |
[postgresql] DB 데이터 내보내기 (0) | 2019.02.13 |