KH/Oracle

# 17 SEQUENCE (시퀀스)

오늘의 진 2022. 9. 2. 12:28

SEQUENCE (시퀀스)

 

: 시퀀스는 오라클 데이터베이스에서 특정 규칙에 맞는 연속 숫자를 생성하는 객체이다. 

은행이나 병원의 대기 순번표와 마찬가지로 번호를 사용해야 하는 사용자에게 계속 다음 번호를 만들어주는 역할을한다. 

 

단지 연속하는 새로운 번호를 만드는 일이라면 MAX 함수에 1을 더하는 값을 사용해도 상관 없을 것이다. 

 

SELECT MAX(글번호)+1 FROM 게시판이름 ; 

 

하지만 이 방식은 테이블 데이터가 많아 질수록 가장 큰 데이터를 찾고 새로운 번호를 계산하는 시간이 함께 늘어나므로 아쉬운 부분이 된다.

또한 동시에 여러곳에서 새로운 번호를 요구했을때 SELECTE문의 결과 값이 같게 나와 번호가 중복 될 수도 있다. 

이와 비교해서 시퀀스는 단순히 번호 생성을 위한 객체이지만 지속적이고 효율적인 번호 생성이 가능해 지므로 여러모로 많이 사용하는 객체이다.

 

 

[형식]

CREATE SEQUENCE 시퀀스이름 
START WITH   n              //시퀀스 번호의 시작값
INCREMENT BY   n            //시퀀스 번호의 증가값
MAXVALUE   n                //시퀀스가 가질수 있는 최대 값
MINVALUE   n                //시퀀스가 가질수 있는 최소 값
CYCLE  |  NOCYCLE           // 지정된 시퀀스가 최대값에 도달했을때 다시 처음부터 시작함|안함
CACHE  |  NOCACHE           //메모리상에 사퀀스값을 미리 할당 기본(20)
                              NOCACHE는 원칙적으로 메모리상의 시퀀스를 관리하지 않음

시작값과 증가값을 주지 않으면 둘다 기본값은 1이다. (1로 시작해서 1씩 증가함)

 

 

(예) cycle

create sequence kor_seq
START with 30
increment by 5
MAXVALUE 150
CYCLE ;

desc user_sequences;

select kor_seq.nextval from dual; // 다음값 보여줌
select kor_seq.currval from dual; // 현재값 보여줌

150을 넘으면 1로 바뀜 

 

 

  •   CURRVAL   

시퀀스의 현재 값을 알아내기위해서 사용

CURRVAL에 새로운 값을 할당받기 위해서는 NEXTVAL로 새로운 값을 생성해야한다. 

즉, NEXTVAL로 새로운 값을 생성하여 새로운값을 CURRVAL에 대체해야한다.

 

  •   NEXTVAL  

시퀀스의 다음 값을 알아내기 위해 사용 

 

현재 시퀀스의 마지막값을 알아낼때 사용 
SELECT LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME ='시퀀스 이름 ' ; // 시퀀스 이름은 대문자로 작성

단 노캐쉬 일때만 가능하다.  예를들어 1,2,3,4 를 사용했다면 위의 식의 결론은 5가 나온다. (다음에 출력될 것을보여줌)

 

만약 캐쉬가 있는경우는 처음시작수 + 캐쉬 크기가 반환된다.  

예를들어 시작수 1 이고 캐쉬가 50 이면 51을 반환한다. 

 

 

 

 

 

(예) nocycle

create sequence eng_seq
START with 50
increment by 50
MAXVALUE 250
noCYCLE ;

max벨류를 넘게 되면 에러 발생 

 

 

 

(예) 시퀀스 사용해보기 

create sequence emp_seq
START with 1
increment by 1
MAXVALUE 10000
CYCLE ;

create table emp_seq_1 (
id VARCHAR2(20)PRIMARY key,
name VARCHAR2(20) not null,
num number(5) DEFAULT 0,
addr VARCHAR2(20) );

insert into emp_seq_1(id,name,num,addr) VALUES('king_1','sun_1',emp_seq.nextval,'서울');
insert into emp_seq_1(id,name,num,addr) VALUES('king_2','sun_1',emp_seq.nextval,'서울');
insert into emp_seq_1(id,name,num,addr) VALUES('king_3','sun_1',emp_seq.nextval,'서울');
insert into emp_seq_1(id,name,num,addr) VALUES('king_4','sun_1',emp_seq.nextval,'서울');
insert into emp_seq_1(id,name,num,addr) VALUES('king_5','sun_1',emp_seq.nextval,'서울');
select * from emp_seq_1;

 시퀀스.nextval을 주어서 num이 1씩 증가되어 들어간 것을 확인 할 수있다.

 

 

 

 

 

 

 

 

'KH > Oracle' 카테고리의 다른 글

# 19 USER 계정 생성  (0) 2022.09.05
# 18 on delete cascade & on delete set null  (0) 2022.09.02
# 16 Transaction (트렌젝션)  (0) 2022.09.01
# 15 DML- insert, update,delect  (0) 2022.08.31
# 14 SET UNSED  (0) 2022.08.30