SEQUENCE
: 번호를 순차적으로 발생시켜주는 객체이다.
- ex) 회원 번호, 사원 번호, 게시글 번호 → 순차적으로 겹치지 않는 숫자로 정의할 때 사용한다.
(1) SEQUENCE 객체 생성 구문
① CREATE SEQUENCE 시퀀스명
② START WITH 시작숫자 (생략 가능)
: 처음 발생시킬 시작값을 설정한다.
③ INCREMENT BY 증가값 (생략 가능)
: 시퀀스를 증가시킬 때마다 몇 씩 증가시킬 것인지 설정한다.
④ MAXVALUE 최댓값 (생략 가능)
: 최댓값을 지정한다.
⑤ MINVALUE 최솟값 (생략 가능)
: 최솟값을 지정한다.
⑥ CYCLE / NOCYCLE (생략 가능)
: 값의 순환 여부를 결정한다.
⑦ CACHE 바이트 크기 / NOCACHE (생략 가능)
: 캐시 메모리의 여부를 지정한다. 기본 크기는 20 BYTE이다.
** 캐시 메모리: 시퀀스로부터 미리 발생될 값들을 생성하여 저장해두는 공간이다.
매번 호출할 때마다 번호를 새로 생성하는 것보다 캐시 메모리 공간에 미리 생성된
값들을 가져다가 쓰는 것이 더 빠르다.
단, 접속이 끊기고 나서 재접속 후에는 기존에 생성되었던 값들은 사라진다.
CREATE SEQUENCE SEQ_EMP_NO -- 사원 번호를 시퀀스로 생성한다.
START WITH 250 -- 250부터 시작한다.
INCREMENT BY 1 -- 시퀀스를 한 번 증가시킬 때마다 1씩 증가한다.
MAXVALUE 300 -- 300까지 증가시킨다.
NOCYCLE -- 값을 순환시키지 않는다.
NOCACHE; -- 캐시 메모리를 지정하지 않는다.
- 현재 접속한 계정이 소유하고 있는 시퀀스에 대한 정보를 조회하려면
SELECT * FROM USERS_SEQUENCES;
(2) SEQUENCE 사용 구문
① 시퀀스명.CURRVAL
: 현재 시퀀스의 값(마지막으로 발생된 NEXTVAL값)
단, 시퀀스를 생성한 후 첫 CURRVAL은 수행이 불가하다. NEXTVAL을 한 번은 수행한 후 수행할 수 있다.
SELECT SEQ_EMP_NO.CURRVAL
FROM DUAL;
-- 오류(sequence SEQ_EMPNO.CURRVAL is not yet defined in this session) 발생.
CURRVAL은 마지막에 정상적으로 수행된 NEXTVAL의 값을 저장해서 보여주는 임시값이기 때문에 시퀀스를 생성하고 나서 NEXTVAL을 한 번이라도 수행하지 않으면 CURRVAL을 수행할 수 없다.
② 시퀀스명.NEXTVAL
: 현재 시퀀스의 값을 증가시킨 후 그 증가된 시퀀스의 값(== CURRVAL+INCREMENT BY)
단, 시퀀스를 생성한 후 첫 NEXTVAL은 START WITH로 지정된 시작값으로 발생한다.
SELECT SEQ_EMP_NO.NEXTVAL FROM DUAL; -- 250
- NEXTVAL을 계속 수행하여 MAXVALUE인 300까지 수행한 경우에 또 NEXTVAL을 수행하면?
SELECT SEQ_EMP_NO.NEXTVAL
FROM DUAL;
-- 오류(sequence SEQ_EMPNO.NEXTVAL exceeds MAXVALUE and cannot be instantiated) 발생.
지정한 MAXVALUE를 초과하기 때문에 오류가 발생한다. 이때 해당 시퀀스의 현재 값을 조회하면 MAXVALUE 지정값이 나온다.
SELECT SEQ_EMP_NO.CURRVAL
FROM DUAL; -- 300
(3) SEQUENCE 수정 구문
① ALTER SEQUENCE 시퀀스명
② START WITH는 변경이 불가능하다. → 바꾸고 싶으면 삭제했다가 다시 생성해야 한다.
③ INCREMENT BY 증가값 (생략 가능)
④ MAXVALUE 최댓값 (생략 가능)
⑤ MINVALUE 최솟값 (생략 가능)
⑥ CYCLE / NOCYCLE (생략 가능)
⑦ CACHE 바이트 크기 / NOCACHE (생략 가능)
ALTER SEQUENCE SEQ_EMP_NO
INCREMENT BY 5
MAXVALUE 310;
SELECT SEQ_EMP_NO.CURRVAL
FROM DUAL; -- 300
시퀀스가 수정되어도 CURRVAL값은 수정되기 전 그대로이다.
SELECT SEQ_EMP_NO.NEXTVAL
FROM DUAL; -- 305
수정된 증가값으로 수행된다.
(4) SEQUENCE 삭제 구문
: DROP SEQUENCE 시퀀스명;
DROP SEQUENCE SEQ_EMP_NO;