Programming/Oracle

[Oracle] 시퀀스 (Sequence)

Isaac S. Lee 2023. 8. 30. 14:45

💡시퀀스


시퀀스(Sequence)는 일련 번호를 생성한다.

시퀀스는 데이터베이스 객체 중 하나로, 오라클 전용 객체이므로 다른 DBMS 제품에는 없다.

주로 식별자(일련번호)를 만드는데 사용하며, 기본값(PK)으로 사용되는 경우가 많다.

 

CREATE SEQUENCE seqNum;

SELECT seqNum.nextVal FROM dual; --일련 번호 생성

호출할 때마다 숫자를 증가하면서 돌려준다.
일련번호를 생성하고 있는 것을 확인할 수 있다.

 

시퀀스 객체 생성하기

CREATE SEQUENCE 시퀀스명;

 

시퀀스 객체 삭제하기

DROP SEQUENCE 시퀀스명;

 

시퀀스 객체 사용하기(함수)

시퀀스객체.nextVal
시퀀스객체.currVal

 

시퀀스의 사용

CREATE TABLE tblMemo
(
	seq number(3),
	name varchar2(30),
	memo varchar2(1000),
	regdate DATE NOT NULL,
	
	--테이블 수준에서 제약 사항 정의
	CONSTRAINT tblMemo_seq_pk PRIMARY KEY(seq),
	CONSTRAINT tblMemo_memo_ck CHECK (LENGTH(memo) >= 3)
);

CREATE SEQUENCE seqMemo;

INSERT INTO tblMemo (seq, name, memo, regdate) VALUES(seqMemo.nextVal, 'Isaac', 'Memo입니다.', sysdate); --5번 실행

SELECT * FROM tblMemo;

회원 추가 코드를 5번 반복 실행하였다.

일련번호를 seq에 저장하도록 하였다. seq에 1씩 증가하여 저장되는 것을 확인할 수 있다.

 

문자 혼합

SELECT 'A' || seqNum.nextVal FROM dual; -- A41

일련번호로 사용하고자 할 때, '||' 기호로 문자를 혼합하여 사용할 수 있다.

 

currVal

SELECT seqNum.currVal FROM dual;

nextVal을 호출하면 나오게 될 숫자를 반환하지만, currVal은 Java Queue, Stack에서의 pop(), peek() 기능처럼 데이터를 증가하지 않고 확인만 하는 기능을 한다.

currVal은 최소 1번 이상의 nextVal을 호출해야 사용할 수 있다.

 

💡시퀀스 옵션


create sequence 시퀀스명
			increment by n --증감치
			start with n
			maxvalue n
			minvalue n
			cycle cache n;

옵션을 추가하여 시퀀스 객체를 생성할 수 있다.

 

increment

CREATE SEQUENCE seqTest
				INCREMENT BY 10;

SELECT seqTest.nextVal FROM dual;

일련번호가 1씩 증가하는 건 시퀀스의 특징이 아니라 increment 옵션을 그렇게 주었기 때문이다.
숫자가 증가만 되는 게 아니라 감소가 되게끔 만드는 것도 가능하다.

 

start with

CREATE SEQUENCE seqTest
				START WITH 10;

SELECT seqTest.nextVal FROM dual;

start with를 설정하면 내가 원하는 숫자부터 시작되게 할 수 있다.

 

maxvalue/minvalue

CREATE SEQUENCE seqTest
				MAXVALUE 10;

--ORA-08004: sequence SEQTEST.NEXTVAL exceeds MAXVALUE and cannot be instantiated
SELECT seqTest.nextVal FROM dual;

maxvalue를 설정하면 데이터가 증가할 최대값을 설정할 수 있다.

만약 데이터가 증가할 수 있는 범위를 벗어날 경우 에러를 출력한다.

minvalue으로 데이터가 감소할 최소값을 설정할 수 있다.

 

cycle cache

CREATE SEQUENCE seqTest
				MAXVALUE 10
				CYCLE
				cache 5;
			
SELECT seqTest.nextVal FROM dual;

일련번호가 10을 넘자 다시 처음 1로 돌아갔다.

순환하는 번호가 필요할 때 cycle cache를 사용한다.

물론 이때는 일련번호로서는 사용할 수 없다.