1. 시퀀스란
오라클에서는 행을 구분하기 위해서 기본 키를 두고 있습니다.
기본 키는 중복된 값을 가질 수 있으므로 항상 유일한 값을 가져야 합니다.
기본 키가 유일한 값을 갖도록 사용자가 직접 값을 생성해내려면 부담이 큽니다.
시퀀스는 테이블 내의 유일한 숫자를 자동으로 생성하는 자동 번호 발생기 이므로
시퀀스를 기본 키로 사용하게 되면 사용자의 부담을 줄일 수 있습니다.
CREATE SEQUENCE sequence_name
[ INCREMENT BY n ]
[ START WITH ]
[ {MAXVALUE n | NOMAXVALUE} ]
[ {MINVALUE n | NOMINVALUE} ]
[ {CYCLE| NOCYCLE} ]
[ {CACHE n | NOCACHE} ];
1) INCREMENT BY 옵션
연속적인 시퀀스 번호의 증가치를 지정할 때 사용됩니다.
만약 1씩 증가하는 시퀀스를 생성하려면 increment by 1 이라고 지정해주면 됩니다.
2) START WITH 옵션
시퀀스 번호의 시작 값을 지정할 때 사용됩니다. 만일 1부터 시작되는 시퀀스를 생성하려면
start with 1 로 지정해주면 됩니다.
3) MAXVALUE 옵션
시퀀스가 가질 수 있는 최대값을 지정합니다.
nomaxvalue 를 지정하면 ascending 순서일 경우에는 10^27 승이고,
descending 순서일 경우에는 -1 로 설정됩니다.
4) MINVALUE 옵션
시퀀스가 가질 수 있는 최소값을 지정합니다.
nominvalue 를 지정하면 ascending 순서일 경우에는 1이고
descending 순서일 경우에는 10^26 승이 설정됩니다.
5) CYCLE 옵션
지정된 시퀀스 값이 최대값까지 증가가 완료되게 되면 다시 start with 옵션에 지정한
시작 값에서 다시 시퀀스를 시작하도록 합니다.
nocycle 은 증가가 완료되게 되면 에러를 유발시킵니다.
6) CACHE 옵션
메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본 값은 20입니다.
nocache는 원칙적으로 메모리 상에서 시퀀스를 관리하지 않습니다.
부서번호를 자동으로 부여해주는 시퀀스 객체를 생성
create sequence detp_deptno_seq
increment by 10
start with 10;
2. CURRVAL 과 NEXTVAL 의 사용
시퀀스의 현재 값을 알아내기 위해 currval 을 사용하고, 다음 값을 알아내기 위해 nextval을 사용합니다.
currval에 새로운 값을 할당하기 위해서는 nextval로 새로운 값을 생성해야 합니다.
select dept_deptno_seq.nextval from dual;
select dept_deptno_seq.currval from dual;
create sequence sample_seq;
select sample_seq.nextval from dual;
select sample_seq.currval from dual;
3. 시퀀스의 수정과 제거
alter sequence dept_deptno_seq
maxvalue 50;
select dept_deptno_seq.currval from dual;
select dept_deptno_seq.nextval from dual;
select dept_deptno_seq.currval from dual;
nextval를 할당하다 보면 50까지만 할당하고 그 이상은 오류를 발생합니다.
시퀀스의 제거
drop sequence sample_seq;
drop sequence dept_deptno_seq;
4. 시퀀스의 실무 적용
99.9% insert 연산과 같이 사용되어 컬럼 값을 자동으로 발생시키는 용도로 사용됩니다.
create table dept15
(
detpno NUMBER(4) PRIMARY KEY,
dname VARCHAR2(25),
loc VARCHAR2(30)
);
desc dept15;
create sequence dept_deptno_seq
increment by 10
start with 10
nocycle;
insert into dept15 values (dept_deptno_seq.nextval, 'test1', 'location1');
insert into dept15 values (dept_deptno_seq.nextval, 'test2', 'location2');
insert into dept15 values (dept_deptno_seq.nextval, 'test3', 'location3');
insert into dept15 values (dept_deptno_seq.nextval, 'test4', 'location4');
select * from dept15;
'DB > Oracle' 카테고리의 다른 글
오라클 JDBC Driver 11.2.0.4 Release (0) | 2015.03.18 |
---|---|
ORA-01502 인덱스 XX인덱스명 또는 XX 분할영역은 사용할 수 없는 상태입니다. (0) | 2015.03.18 |
Snapshot too old(ORA-01555) (0) | 2015.03.18 |
Oracle 11g PIVOT, UNPIVOT (0) | 2015.03.16 |
WAS 에서 DB로 접속 불가 java.sql.SQLRecoverableException: IO Error: Connection reset (0) | 2015.03.09 |