0. 개요

시스템을 운영하다가 다음의 요구사항이 주어졌다.

-YYYYMMXXX 형식의 문서 번호 채번 (YYYY: 현재 연도 / MM: 이번 달 / XXX: 000 ~ 999 까지 채번)

-XXX 값은 매 월 001로 초기화되어야 함

 

1. 작업 방향

-위 요구사항에 맞추어, 아래와 같이 작업을 설계했다.

(1) 신규 시퀀스 생성

(2) 시퀀스 초기화 Procedure 생성

(3) (2)Procedure를 매 월 바뀔 때 실행 (DB 스케줄러 등록)

 

2. 신규 시퀀스 생성

시퀀스는 작업 목적에 맞추어, 다음과 같이 생성했다.

CREATE SEQUENCE SMSS_APR_NOTI_DOC_SEQ   --시퀀스이름 SMSS_APR_NOTI_DOC_SEQ
INCREMENT BY 1                                           --증감숫자 1
START WITH 16897                                        --시작숫자
MINVALUE 1                                                 --최소값 1
MAXVALUE 999                                             --최대값 999
NOCYCLE                                                      --순환하지않음
CACHE 20;                                                    --메모리에 시퀀스값 미리할당 20

### 생성 완료 ###

3. 시퀀스 초기화 프로시저 생성

시퀀스를 초기화하는 프로시저를 생성했다.

1)시퀀스 현재 값을 저장하여

2)INCREMENT 값을 시퀀스 현재 값으로 수정한 후

3)현재 값에서 INCREMENT 값 만큼 뺄셈하는 시퀀스를 실행하여 현재 값을 0으로 만들고

4)다시 INCREMENT 값을 1로 수정하는 방식이다.

 

-프로시저 명: P_INIT_SMSS_APR_NOTI_DOC_SEQ

-프로시저 내용

create or replace PROCEDURE P_INIT_SMSS_APR_NOTI_DOC_SEQ IS L_VAL NUMBER;
BEGIN

    EXECUTE IMMEDIATE 'SELECT SMSS_APR_NOTI_DOC_SEQ.NEXTVAL FROM DUAL' INTO L_VAL;
    
    EXECUTE IMMEDIATE 'ALTER SEQUENCE SMSS_APR_NOTI_DOC_SEQ INCREMENT BY -'|| L_VAL ||' MINVALUE 0';
    
    EXECUTE IMMEDIATE 'SELECT SMSS_APR_NOTI_DOC_SEQ.NEXTVAL FROM DUAL' INTO L_VAL;
    
    EXECUTE IMMEDIATE 'ALTER SEQUENCE SMSS_APR_NOTI_DOC_SEQ INCREMENT BY 1 MINVALUE 0';
 
END;

 

아래 SQL을 실행하면 실제 0으로 초기화가 됨을 알 수 있다.

EXEC P_INIT_SMSS_APR_NOTI_DOC_SEQ;

 

4. 스케줄러 등록

이제, 매 월 위 프로시저를 실행하는 스케줄러를 등록하는 일만 남았다.

내가 등록한 스케줄러는 다음과 같다.

이제, 매 월이 바뀔 때 내가 생성한 시퀀스가 0으로 초기화될 것이다.

 

5. 마무리 작업

애초에 내가 채번해야 하는 양식은 YYYYMMXXX 였다.

XXX 세 자리이기 때문에, 시퀀스 값을 그대로 넣으면 2021061 처럼 출력되는 불상사가 생긴다.

그래서 나는 시퀀스 값에 1000을 더한 후, substr로 뒤 3자리만 자르도록 코딩했다.

1 -> 1001 -> 001

 

끝.

+ Recent posts