고래씌

[Oracle] 12. Object(SEQUENCE) - 시퀀스 본문

Database/Oracle

[Oracle] 12. Object(SEQUENCE) - 시퀀스

고래씌 2023. 11. 30. 16:56

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