Database/Oracle

[SQL]OBJECT(SEQUENCE)

Ma_Sand 2022. 3. 31. 13:39
반응형

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;
반응형