고래씌
[Oracle] 12. Object(SEQUENCE) - 시퀀스 본문
1. 시퀀스(SEQUENCE)
- 자동으로 번호를 발생시켜주는 역할을 하는 객체(자동번호 부여기)
- 정수값을 자동으로 순차적으로 발생시켜줌(연속된 숫자)
- 순차적으로 "겹치지않는"숫자를 채번할 때 사용
=> 사번, 회원번호, 게시글번호, 이미지번호 등등...
[표현법]
CREATE SEQUENCE 시퀀스명 [ START WITH 시작숫자 => 처음 발생시킬 시작값 설정(DEFAULT 1) INCREMENT BY 증가값 => 한번 시퀀스를 증가시킬때마다 증가시킬 다음값(DEFAULT 1) MAXVALUE 최대값 => 최대값 지정 MINVALUE 최소값 => 최소값 지정 CYCLE/NOCYCLE => 값의 순환(최대값까지 증가후 초기화) CACHE 바이트 크기/NOCACHE ] => 캐시메모리 사용여부 CACHE_SIZE 기본값은 20 BYTE [] 생략가능 |
Q. 캐시메모리란?
- 시퀀스로부터 미리 발생될 값들을 생성해서 저장해두는 공간.
- 매번 호출할 때마다 새로이 번호를 생성하는 것보단 캐시메모리 공간에 미리 생성된 값들을 가져다 쓰게 되면 훨씬 속도가 빠름.
- 단, 접속이 끊기고 나서 재접속 후에는 기존에 생성해놨던 값들은 초기화
▶ 예제
CREATE SEQUENCE SEQ_TEST; |
- SELECT * FROM USER_SEQUENCES; 을 통해 시쿠너스 데이터 딕셔너리 확인
- 직접 값 설정하여 SEQUENCE 생성
2. 시퀀스 사용 구문
- 시퀀스명.CURRVAL : 현재 시퀀스의 값(마지막으로 성공적으로 발생된 NEXTVAL 값)
- 시퀀스명.NEXTVAL : 현재 시퀀스의 값을 증가시키고, 그 증가된 시퀀스의 값
== 시퀀스명.CURRVAL + INCREMENT_BY 값만큼 증가된 값
- 단, 시퀀스 생성 후 첫 NEXTVAL은 START WITH으로 지정된 시작값으로 발생된다.
NEXTVAL 이 호출되지 않았다면, CURRVAL은 수행불가
SELECT SEQ_EMPNO.CURRVAL FROM DUAL; |
☞ 에러발생! 시퀀스가 생성되고 나서 NEXTVAL을 한번이라도 수행해야 CURRVAL을 수행할 수 있다.
☞ CURRVAL은 마지막에 성공적으로 수행된 NEXTVAL을 보여주는 임시값이기 때문이다.
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 300 SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 300 |
☞ 먼저 NEXTVAL을 수행하고 나서야 CURRVAL 정상적으로 실행됨.
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 305 SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 305 |
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 310 |
☞ 310 까지 한후 다음 또 SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 문을 실행하면...?
=> 지정한 MAXVALUE 값을 초과했기 때문에 오류 발생
☞ 다음 SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 실행하고 싶다면 MAXVALUE의 설정값을 변경시켜주면 된다.
아래에 "3. 시퀀스 변경"에서 살펴보도록 한다.
3. 시퀀스 변경
[표현법]
ALTER SEQUENCE 시퀀스명 INCREMENT BY 증가값 MAXVALUE 최대값 MINVALUE 최소값 CYCLE/NOCYCLE CHCHE 크기/NOCHCHE => START WITH은 변경 불가 |
▶ SEQ_EMPNO 시퀀스의 MAXVALUE 값 변경, 10씩 증가로 변경
SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 310 SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 320 |
▶ 시퀀스 삭제
DROP SEQUENCE SEQ_EMPNO; |
▶ 예제
- 사번 채번용 시퀀스 생성(시퀀스명 SEQ_EID)
- 사원이 추가될 때 실행할 INSERT 문
☞ NEXTVAL에 의해 값이 증가되는 것을 알 수 있다
▶ 시퀀스를 사용할 수 없는 구문
- VIEW의 SELECT
- DISTINCT가 포함된 SELECT
- GROUP BY절이 있는 SELECT
- SELECT, UPDATE, DELETE 등에서 서브쿼리 내부
- CREATE TABLE, ALTER TABLE, DEFAULT로 사용 불가
'Database > Oracle' 카테고리의 다른 글
[Oracle] 14. PL/SQL (0) | 2023.12.01 |
---|---|
[Oracle] 13. Object(INDEX) - INDEX (0) | 2023.12.01 |
[Oralce] DDL 실습문제 (0) | 2023.11.30 |
[Oracle] 11. Object(VIEW) (0) | 2023.11.30 |
[Oracle] 10. TCL(COMMIT, ROLLBACK) (0) | 2023.11.30 |