2021-04-01
오라클 SQL 내부에서의 시퀀스는 고유 한 정수를 생성할 수 있는 데이터베이스 개체인 시퀀스를 만든다. 시퀀스를 사용하여 기본 키 값을 자동으로 생성할 수 있다. 여기서 기본 키 값이라고 표현한 이유는 시퀀스는 테이블 내부에 객체를 추가(INSERT) 할 때마다 자동으로 1 ~ N의 수만큼 커지기 때문이다. 그렇기 때문에 한 테이블 내에 동일한 시퀀스 값은 존재할 수 없다.
이해하기 쉬운 예를 들자면 특정 사이트의 게시판에 새로운 게시글을 작성하면 게시판번호가 좌측 끝이나 우측 끝에 추가되어 게시판에 등록되는 것도 하나의 시퀀스라고 볼 수 있다.
- 선언
시퀀스에는 다양한 옵션을 부여할 수 있다. 옵션은 아래의 코드와 같이 부여 할 수 있다.
-- 시퀀스 이름 설정
CREATE SEQUENCE TEST_SEQ
--시퀀스 시작값 설정
START WITH 1
--시퀀스 증가값 설정
INCREMENT BY 1
--시퀀스 최솟값 설정
MINVALUE 1
--시퀀스 최대값 설정
MAXVALUE 9999999
--순환설정 NOCYCLE 는 반복하지 않음
CYCLE
--(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT) 보다 작아야함
CACHE 10;
* START WITH : 시퀀스의 시작값을 설정한다
* INCREMENT BY "증가값" : 시퀀스가 증가하는 값의 범위를 설정할 수 있다.
* MINVALUE "NUMBER": 시퀀스의 최솟값
* MAXVALUE "NUMBER": 시퀀스의 최댓값
* CYCLE/NOCYCLE : 정해진 범위 내의 시퀀스 반복 여부
* CACHE/NOCACHE : 보다 빠른 엑세스를 위한 캐시 부여 여부와 캐시 크기 설정
(사실 OREDER 라는 옵션도 있는데 사용할 일 없다고 봐도 무방하다.)
여기서 중요한 점은 CYCLE 을 사용할 경우 CHACE 크기 범위는 (CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT) 해당 공식의 범위에 있어야 한다 그 이유는 주어진 시퀀스에 사이클 사용시 해당 사이클범위보다 많은 값을 캐시에 저장할 수 없기 때문이다.
사실 선언식이 복잡해 보이지만 보통은 기본 INCREMENT가 하나씩 증가하는 DEFAULT 설정을 사용하기 때문에 아래와 같이 선언하는 경우가 대부분이다.
CREATE SEQUENCE TEST_SEQ;
- 사용
사용 방법은 아래와 같다. [ 시퀀스명.NEXTVAL ]를 통해 정해진 INCREMENT 값에 따라 시퀀스를 1~N 값씩 증가시키는 방식이다.
SELECT TEST_SEQ.NEXTVAL FROM DUAL;
또한 증가시킬 의도가 아닌 단순 조회가 목적이면, 아래의 코드 [시퀀스명. CURRVAL] 사용하면 된다.
SELECT TEST_SEQ.CURRVAL FROM DUAL;
다만 여기서 주의할점은 시퀀스 생성 후 최초 [ 시퀀스명.CURRVAL ] 쿼리문을 사용할 경우 아래와 같은 에러가 발생한다.
이는 에러 내용과 같이 시퀀스가 세션에서 최초로 사용되지 않았기 때문에 값 조회가 되지 않는다. 때문에 [시퀀스명. NEXTVAL]한 번 이상 사용한 후 [ 시퀀스명.CURRVAL ] 를 사용 해야 한다.
- 삭제
삭제는 DROP으로 간단하게 해결할 수 있으며, 아래의 코드를 보자.
DROP SEQUENCE TEST_SEQ;
-수정
수정도 간단하다 CREATE 대신에 ALTER로 치환만 해주면 된다. 여기서 주의할 점이 있다. 이미 생성된 시퀀스이고 실행된 시퀀스라면 변경 시 START WITH 옵션은 줄 수 없다. 말 그대로 이미 실행된 시퀀스 이기 때문이다.
-- 시퀀스 이름 설정
ALTER SEQUENCE TEST_SEQ
--시퀀스 증가값 설정
INCREMENT BY 1
--시퀀스 최솟값 설정
MINVALUE 1
--시퀀스 최대값 설정
MAXVALUE 9999999
--순환설정 NOCYCLE 는 반복하지 않음
CYCLE
--(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT) 보다 작아야함
CACHE 10;