[DB]/04. Oracle Object

02. SEQUENCE (시퀀스)

76beny 2022. 5. 14. 20:25
 

SEQUENCE

자동 번호 발생기 역할로 사용자가 정해준 숫자로부터 일정 숫자가 자동으로 증감되는 객체
 주사용처 : 사번, 주문번호, 게시판번호 등의 일련번호
 응용 : 코드화 해서 활용됨 ex) 100xxxxxxx -> 전자제품  200xxxxxxx -> 식품

 

문법

CREATE SEQUENCE '시퀀스 명'
[START WITH 숫자]        -- 처음 시작되는 숫자, default : 1
[INCREMENT BY 숫자]      -- 증감되는 수,       default : 1
[MAXVALUE 숫자 | NOMAXVALUE] -- 최대값 default : 10^27
[MINVALUE 숫자 | NOMINVALUE] -- 최소값 default : -10^28
[CYCLE | NOCYCLE] -- 값의 순환여부. NO CYCLE일 경우 MAX값 이후로 생성되지 않음 -> ERROR 발생 -- Default : NO CYCLE
[CACHE <byte 크기> | NOCACHE] -- 메모리 상에 시퀀스 값 관리 여부, default : 20

-- ※ 주의 : SEQUENCE는 최초 생성 이후 증감하지 않으면 사용할수 없음. NEXTVAL 명령 사용 필요

예시

CREATE SEQUENCE SEQ_EMPID
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;

SELECT SEQ_EMPID.CURRVAL FROM DUAL;
SELECT SEQ_EMPID.NEXTVAL FROM DUAL;
SELECT SEQ_EMPID.CURRVAL FROM DUAL;
SELECT SEQ_EMPID.NEXTVAL FROM DUAL;
SELECT SEQ_EMPID.NEXTVAL FROM DUAL;
SELECT SEQ_EMPID.NEXTVAL FROM DUAL;

 

시퀀스 조회방법

SELECT * FROM USER_SEQUENCES;

 

 

 

NEXTVAL/CURRVAL 사용 가능 여부

 사용법

-- '시퀀스명'.NEXTVAL : 증감되는 다음 값을 가져오는 명령어
-- '시퀀스명'.CURRVAL : 현재 값을 가져오는 명령어
사용가능  사용불가
서브쿼리가 아닌 SELECT문  VIEW의 SELECT절
INSERT문의 SELECT절 DISTINCT 키워드가 있는 SELECT문
INSERT문의 VALUE절  GROUP BY, HAVING, ORDER BY 절이 있는 SELECT문
UPDATE문의 SET절  SELECT, DELETE, UPDATE의 서브쿼리
  CREATE TABLE, ALTER TABLE 명령의 DEFAULT값
DROP SEQUENCE SEQ_TEST1;-- 시퀀스 삭제하는 방법
CREATE SEQUENCE SEQ_TEST1; -- 일반적으로 SEQ 같이 시퀀스 표식을 붙여서 사용;
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; -- 증감 방법(시퀀스를 생성하고 최초1회사용이 필요)
SELECT SEQ_TEST1.CURRVAL FROM DUAL; -- 최초 1회 증감 이후에 조회가 가능하다.

 

시퀀스 응용

■  초기화 방법
■ 일반적인 초기화 문법 제공하지 않음. DROP -> CREATE 활용

-- 시퀀스 응용
-- 300부터 시작해서 5씩 증가하고, 최대 310까 사용하고, NO CACHE, NO CYCLE
CREATE SEQUENCE SEQ_TEST2
    START WITH 300
    INCREMENT BY 5
    MAXVALUE 310
    NOCACHE;

SELECT SEQ_TEST2.NEXTVAL FROM DUAL;
--1번RUN하면 300, 2번째 RUN하면 305,3번째 RUN하면 310!!!
-- 310 초과하면 ERROR 발생
-- 최종적으로 증감된 시퀀스는 재사용 불가능!! -> DROP 이후 재사용필요.

1번째 RUN
2번째 RUN
3번째 RUN

 

시퀀스 수정&삭제

삭제

DROP SEQUENCE SEQ_TEST2;

 

 수정

ALTER SEQUENCE SEQ_TEST1;

 

시퀀스 실제 사용예시

DROP TABLE TBL_KH_USER;
CREATE TABLE TBL_KH_USER(
    USER_NO NUMBER PRIMARY KEY, -- 시퀀스 번호로 자동 사번 생성
    USER_ID VARCHAR2(30) NOT NULL UNIQUE,
    USER_NAME VARCHAR2(30) NOT NULL
);

DROP SEQUENCE SEQ_USER_NO;
CREATE SEQUENCE SEQ_USER_NO START WITH 10000;
--SEQ_USER_NO.NEXTVAL; -- 숫자확인을 위해 DUAL 사용 권고
--SELECT SEQ_USER_NO.NEXTVAL FROM DUAL;

INSERT INTO TBL_KH_USER VALUES(SEQ_USER_NO.NEXTVAL, 'TEST1', '홍길동');
INSERT INTO TBL_KH_USER VALUES(SEQ_USER_NO.NEXTVAL, 'TEST2', '김길동');

SELECT * FROM TBL_KH_USER;

 

 


"본 인터넷 사이트 내의 모든 이미지, 문구, 콘텐츠, 내용 등에 대한 저작권은 76beny에게 있습니다.

이를 무단으로 도용, 복사, 전재, 재배포, 2차 변형 등을 할 경우

민, 형사상 법적 조치 등 저작권법에 의거하여 처벌 받을 수 있습니다."