2015년 1월 22일 목요일

#84. 오라클 시퀀스(Oracle Sequence)

#84. 오라클 시퀀스(Oracle Sequence) 

시퀀스(Sequence) 

 다중 사용자 환경에서 사용하는 숫자 자동 생성기. 
 PK, UK 칼럼의 값을 유일하게 자동으로 생성하는 경우에도 사용된다. 
 트랜잭션 내에서 시퀀스가 생성되어 사용되다가 롤백 되는 경우에 다음 시퀀스 번호는 SKIP 될 수 있다. 
 테이블 또는 칼럼과는 독립적으로 생성, 삭제된다. 
 CURRVAL : 시퀀스의 현재 값을 리턴 
 NEXTVAL : 시퀀스를 증가시키고 next value를 리턴한다. 

 [형식] 
CREATE SEQUENC sequence_name 
                [INCREMENT BY n] 
                [START WITH n] 
                [{MAXVALUE n | NOMAXVALUE}] 
                [{MINVALUE n | NOMINVALUE}] 
                [{CYCLE | NOCYCLE}] 
                [{CACHE n | NOCACHE}] 

 INCREMENT BY n : 생성되는 Sequence번호의 간격을 정수 n으로 정의.  옵션이 생략되면 시퀀스는 1씩 증가한다.
 START WITH n : 첫 번째 Sequence 번호를 정의, 옵션이 생략되면 시퀀스는 1부터 시작한다. 
 MAXVALUE n : Sequence의 최대값을 정의. NOMAXVALUE가 default이며 최대값은 10의 27승이다. 
 MINVALUE n : 생성 가능한 Sequence의 최소값을 정의, 디폴트가 NOMINVALUE이며 최소값은 1이다. 
 CACHE n : 서버가 메모리 캐시에 미리 생성해 놓는 시퀀스 개수. 기본갓은  20이다.  캐시하지 않으려면 NOCACHE 옵션을 사용한다. 

[시퀀스를 사용할 수 없는 예] 
SQL> CREATE TABLE seq_tab ( a NUMBER DEFAULT s1.NEXTVAL); 
(* Error 발생) 
SQL> SELECT DISTINCT s1.NEXTVAL FROM dual; 
(* Error 발생) 
SQL> SELECT SUM(salary) FROM s_emp GROUP BY s1.NEXTVAL; 
(* Error 발생) 


SQL> create sequence seq_e1; 

시퀀스가 생성되었습니다. 

SQL> select seq_e1.currval from dual; 
select seq_e1.currval from dual 
      * 
1행에 오류: 
ORA-08002: 시퀀스 SEQ_E1.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다 
-- 최초 한번은 NEXTVAL해야 CURRVAL 값을 조회 가능하다. 

SQL> create table test4 (n number); 

테이블이 생성되었습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 

SQL> insert into test4 values (seq_e1.nextval); 

1 개의 행이 만들어졌습니다. 


SQL> select * from test4; 

        N 
---------- 
        1 




SQL>  drop sequence seq_e1; 

시퀀스가 삭제되었습니다.

댓글 없음:

댓글 쓰기