본문 바로가기

개발(합니다)/DB

[DB] tibero에서 job 사용하는 방법

반응형

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
  • 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;
/

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;

반응형