상세 컨텐츠

본문 제목

[오라클 교재] 제11장 SEQUENCE

프로그래밍/DB

by 라제폰 2008. 12. 26. 21:04

본문

1. SEQUENCE

SEQUENCE는 테이블의 행에 대한 SEQUENCE 번호를 자동적으로 생성하기 위해 사용될 수 있다. SEQUENCE는 사용자가 생성한 데이터베이스 객체이다. SEQUENCE에 대한 전형적인 사용은 각행에 대해 유일해야 하는 PRIMARY KEY 값을 생성하기 위해서 입니다. SEQUENCE Oracle8에 의해 발생되고 증가(또는 감소) 됩니다.

 

1.1 SEQUENCE 특징

1)       자동적으로 유일 번호를 생성합니다.

2)       공유 가능한 객체

3)       주로 기본 키 값을 생성하기 위해 사용됩니다.

4)       어플리케이션 코드를 대체합니다.

5)       메모리에 CACHE되면 SEQUENCE 값을 액세스 하는 효율성을 향상시킵니다.

 

1.2 Syntax

CREATE  SEQUENCE  sequence_name

        [INCREMENT  BY  n]

        [START  WITH  n]

        [{MAXVALUE n | NOMAXVALUE}]

        [{MINVALUE n | NOMINVALUE}]

        [{CYCLE | NOCYCLE}]

        [{CACHE | NOCACHE}];

sequence_name        SEQUENCE의 이름입니다.

INCREMENT  BY  n     정수 값인 n으로 SEQUENCE번호 사이의 간격을 지정.

                     이 절이 생략되면 SEQUENCE 1씩 증가.

START  WITH  n               생성하기 위해 첫번째 SEQUENCE를 지정.

                     이 절이 생략되면 SEQUENCE 1로 시작.

MAXVALUE n           SEQUENCE를 생성할 수 있는 최대 값을 지정.

NOMAXVALUE           오름차순용 10^27 최대값과 내림차순용-1의 최소값을 지정.

MINVALUE n           최소 SEQUENCE값을 지정.

NOMINVALUE           오름차순용 1과 내림차순용-(10^26)의 최소값을 지정.

CYCLE | NOCYCLE              최대 또는 최소값에 도달한 후에 계속 값을 생성할 지의 여부를

                     지정. NOCYCLE이 디폴트.

CACHE | NOCACHE      얼마나 많은 값이 메모리에 오라클 서버가 미리 할당하고 유지

                       하는가를 지정. 디폴트로 오라클 서버는 20 CACHE.

 

 

 

 

문제1) DEPT 테이블의 PRIMARY KEY에 사용되는 DEPT_DEPTNO SEQUENCE를 생성 합니다.

SQL> CREATE SEQUENCE dept_deptno

  2  INCREMENT BY 1

  3  START WITH 91

  4  MAXVALUE 99

  5  NOCACHE

  6  NOCYCLE;

 

♣ 참고

CYCLE OPTION을 사용해서는 안됩니다.(PRIMARY KEY으로 사용될 경우)

 

1.3 SEQUENCE 학인

한번 SEQUENCE를 생성했으면 데이터 사전에 등록 됩니다. SEQUENCE가 데이터베이스 객체가 된 이후에 USER_OBJECTS DATA DICTIONARY에서 식별할 수 있습니다. 또한 데이터 사전의 USER_SEQUENCES 테이블을 검색함으로써 SEQUENCE의 설정 값을 확인할 수 있다.

 

문제2) 현재 SESSION을 이루고 있는 사용자가 소유하고 있는 SEQUENCE를 조회하여라.

SQL> SELECT sequence_name,min_value,max_value,increment_by,last_number

  2  FROM user_sequences;

 

SEQUENCE_NAME                  MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER

------------------------------ --------- --------- ------------ -----------

CUSTID                                 1 1.000E+27            1         109

DEPT_DEPTNO                            1        99            1          91

ORDID                                  1 1.000E+27            1         622

PRODID                                 1 1.000E+27            1      200381

 

1.4 SEQUENCE 사용법

테이블에 사용할 절차적인 번호를 생성하기 위해 SEQUENCE를 사용할 수 있다. NEXTVALUE CURRVALUE 의사열을 사용하여 SEQUENCE값을 참조한다.

 

1.4.1 NEXTVAL CURRVAL 의사열

) 특징

1)       NEXTVAL는 다음 사용 가능한 SEQUENCE 값을 반환 한다.

2)       SEQUENCE가 참조될 때 마다, 다른 사용자에게 조차도 유일한 값을 반환한다.

3)       CURRVAL은 현재 SEQUENCE값을 얻는다.

4)       CURRVAL이 참조되기 전에 NEXTVAL이 사용되어야 한다.

 

 

) NEXTVAL CURRVAL의 사용 규칙

1)       NEXTVAL CURRVAL을 사용할 수 있는 경우

       SUBQUERY가 아닌 SELECT

       INSERTdml SELECT

       INSERT문의 VALUES

       UPDATE문의 SET

2)       NEXTVAL CURRVAL사용할 수 없는 경우

       VIEW문의 SELECT

       DISTINCT 키워드를 사용한 SELECT

       GROUP BY, HAVING, ORDER BY를 이용한 SELECT

       SELECT, DELETE, UPDATE문장에서의 SUBQUERY

       CREATE TABLE, ALTER TABLE명령문의 DEFAULT

 

문제3) DEPT 테이블에 부서명을 영업부, 위치를 분당구 정자동을 입력하여라.

SQL> INSERT INTO dept

  2  VALUES (DEPT_DEPTNO.NEXTVAL,'영업부','분당구 정자동');

 

1 row created.

 

문제4) DEPT_DEPTNO SEQUENCE의 현재 값을 확인하시오.

SQL> SELECT dept_deptno.CURRVAL

  2  FROM dual;

 

  CURRVAL

---------

       91

 

1.5 SEQUENCE CACHE

SEQUENCE 값에 대해 보다 빠른 액세스를 허용하기 위해 메모리에 SEQUENCE CACHE합니다. CACHE SEQUENCE를 처음 참조할 때 형성됩니다. 다음 SEQUENCE 값에 대한 요구는 CACHE SEQUENCE에서 읽어 들입니다. 마지막 SEQUENCE가 사용된 후에 SEQUENCE에 요구하면 CACHE SEQUENCE를 메모리에 갖다 놓습니다.

 

1.6 SEQUENCE에서 간격의 경계

1)       SEQUENCE 값에서 간격(gap)은 아래의 상황에서 발생합니다.

       ROLLBACK

       SYSTEM CRASH

       SEQUENCE가 다른 테이블에서 사용될 때

1.7 SEQUENCE 수정

INCREMENT  BY, MAXVALUE, MINVALUE, CYCLE, CACHE을 변경할 수 있습니다.

 

1.7.1 Syntax

ALTER  SEQUENCE  sequence_name

        [INCREMENT  BY  n]

        [{MAXVALUE n | NOMAXVALUE}]

        [{MINVALUE n | NOMINVALUE}]

        [{CYCLE | NOCYCLE}]

        [{CACHE | NOCACHE}];

 

1.7.2 SEQUENCE 수정 지침

1)       SEQUENCE에 대한 ALTER 권한을 가지거나 소유자여야 합니다.

2)       이후의 SEQUENCE번호만 영향을 받습니다.

3)       SEQUENCE는 다른 번호에서 SEQUENCE를 다시 시작하기 위해서는 제거하고 다시 생성하여야 합니다.

4)       유효한 검사를 수행합니다.

 

1.8 SEQUENCE 제거

데이터 사전에서 SEQUENCE를 제거하기 위해 DROP SEQUENCE문장을 사용합니다. SEQUENCE를 제거하기 위해서는 소요자이거나 DROP ANY SEQUENCE권한을 가져야 합니다.

 

1.8.1 Syntax

DROP  SEQUENCE  sequence_name;

 

문제) DEPT_DEPTNO SEQUENCE를 삭제하여라

SQL> DROP SEQUENCE dept_deptno;

 

Sequence dropped.

 

 

 


◈ 연 습 문 제 ◈

 

1. 초기값1부터 최대값999,999까지 1씩 증가하는 TEST_SEQ SEQUENCE를 생성하여라.

 

 

2. 현재 SESSION을 이루고 있는 사용자가 사용할 수 있는 SRQUENCE를 조회하여라.

 

 

3. 1번에서 작성한 SRQUENCE의 현재 값을 조회하여라.

 

 

4. CURRVAL NEXTVAL을 설명하여라.

 

 

5. CACHE NOCACHE의 차이점을 설명하여라.

 

 

6. CYCLE NOCYCLE의 차이점을 설명하여라.

 

 

7. 1번에서 생성한 SRQUENCE를 삭제하여라.


관련글 더보기