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
끝.
'IT | 개발 > Database' 카테고리의 다른 글
[Oracle] SQL Developer 쿼리 날짜 형식 출력 변경 (YYYY/MM/DD HH24:MI:SS) (0) | 2021.07.22 |
---|---|
[Oracle] 숫자 3자리마다 콤마(,) 넣어서 출력하기 (123,456.3) (2) | 2021.07.15 |
[Oracle | SQL Developer] 라인 수 보이기 설정 방법 (0) | 2021.05.31 |
[Oracle | 오류 해결] error code [17034] 해당 위치에 지원되지 않는 SQL92 토큰 (2) | 2020.11.27 |
[Database] SQL Developer 쿼리 정렬 단축키 (0) | 2020.09.08 |