Post

Oracle CREATE SEQUENCE

1. CREATE SEQUENCE 문 소개

CREATE SEQUENCE 문을 사용하여 데이터베이스에 새 시퀀스를 작성할 수 있다.

다음은 CREATE SEQUENCE 문의 기본 구문이다.

1
2
3
4
5
6
7
8
CREATE SEQUENCE schema_name.sequence_name
[INCREMENT BY interval]
[START WITH first_number]
[MAXVALUE max_value | NOMAXVALUE]
[MINVALUE min_value | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE cache_size | NOCACHE]
[ORDER | NOORDER];

1) CREATE SEQUENCE

CREATE SEQUENCE 키워드 뒤에 시퀀스 이름을 지정한다. 특정 스키마에서 시퀀스를 만들려면 스키마 이름과 시퀀스 이름을 함께 지정할 수 있다.

2) INCREMENT BY

INCREMENT BY 키워드 뒤에 시퀀스 번호 간격을 지정한다.

interval은 28자리 미만이어야 한다. 또한 MAXVALUE - MINVALUE보다 작아야 한다.

interval이 양수인 경우 순서는 오름차순이다(예: 1, 2, 3, …).

interval이 음수인 경우 시퀀스는 내림차순이다(예: -1, -2, -3 …).

interval 기본값은 1이다.

3) START WITH

시퀀스의 첫 번째 숫자를 지정한다.

첫 번째 숫자의 기본값은 오름차순의 최소값과 내림차순의 최대값이다.

4) MAXVALUE

시퀀스의 최대값을 지정한다.

max_value는 START WITH 키워드 뒤에 지정한 first_number보다 크거나 같아야 한다.

5) NOMAXVALUE

NOMAXVALUE를 사용하여 오름차순의 경우 최대 값 10^27을 나타내고 내림차순의 경우 -1을 나타낸다. Oracle은 이 옵션을 기본값으로 사용한다.

6) MINVALUE

시퀀스의 최소값을 지정힌다.

min_value는 first_number보다 작거나 같아야 하며 max_value보다 작아야 한다.

7) NOMINVALUE

NOMINVALUE를 사용하여 오름차순의 경우 최소값 1을 나타내고 내림차순의 경우 -10^26을 나타낸다. 이것이 기본값이다.

8) CYCLE

CYCLE을 사용하여 한계값에 도달한 후 시퀀스가 값을 생성하고, 하강 시퀀스의 최소값 및 상승 시퀀스의 최대값을 생성할 수 있다.

오름차순 시퀀스가 최대값까지 도달하면 최소값이 생성된다.

반면에 하강 시퀀스가 최소값에 도달하면 최대값을 생성한다.

9) NOCYCLE

다음 값이 한계에 도달할 때 시퀀스가 다음 값 생성을 중지하도록 하려면 NOCYCLE을 사용한다. 이것이 기본값이다.

10) CACHE

Oracle이 더 빠른 액세스를 위해 미리 할당하고 메모리에 보관할 시퀀스 값의 수를 지정한다.

캐시 최소 크기는 2이다. 캐시 크기의 최대값은 다음 공식을 기반으로 한다.

1
(CEIL (MAXVALUE - MINVALUE)) / ABS (INCREMENT)

시스템 오류 이벤트가 발생하면, 커밋된 SQL 문에 사용되지 않은 모든 캐시된 시퀀스 값이 손실된다.

11) ORDER

ORDER를 사용하여 Oracle이 요청 순서대로 시퀀스 번호를 생성하는지 확인한다.

이 옵션은 Oracle Real Application Cluster를 사용하는 경우에 유용하다. 독점 모드를 사용하는 경우 Oracle은 항상 순서대로 시퀀스 번호를 생성한다.

12) NOORDER

Oracle에서 요청 순서대로 시퀀스 번호를 생성하지 않으려면 NOORDER를 사용한다. 이 옵션이 기본값이다.

2. CREATE SEQUENCE 문 예제

시퀀스를 사용하는 예제이다.

1) 기본 Oracle 시퀀스 예제

다음 명령문은 id_seq라는 오름차순을 생성하는데, 10에서 시작하여 10, 최소값 10, 최대값 100까지 증가시킨다. CYCLE 옵션 때문에 100에 도달하면 10을 반환한다.

1
2
3
4
5
6
7
CREATE SEQUENCE id_seq
    INCREMENT BY 10
    START WITH 10
    MINVALUE 10
    MAXVALUE 100
    CYCLE
    CACHE 2;

시퀀스의 다음 값을 가져오려면 NEXTVAL pseudo-column을 사용한다.

1
2
3
4
SELECT
    id_seq.NEXTVAL
FROM
    dual;

결과이다.

1
2
3
NEXTVAL
-------
     10

시퀀스의 현재 값을 가져오려면 CURRVAL pseudo-column을 사용한다.

1
2
3
4
SELECT
    id_seq.CURRVAL
FROM
    dual;

현재 값은 10이다.

1
2
3
CURRVAL
-------
     10

이 SELECT 문은 id_seq.NEXTVAL을 반복으로 사용한다.

1
2
3
4
5
SELECT
    id_seq.NEXTVAL
FROM 
    dual
CONNECT BY level <= 9;

결과이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
NEXTVAL
------
    20
    30
    40
    50
    60
    70
    80
    90
   100

9 rows selected

id_seq 시퀀스에 대한 CYCLE 옵션을 설정하기 때문에, id_seq의 다음 값은 10이 된다.

1
SELECT id_seq.NEXTVAL FROM dual;

결과이다.

1
2
3
NEXTVAL
-------
     10

2) 테이블 컬럼의 시퀀스 사용 예제

Oracle 12c 이전에서는 삽입 시간에만 테이블 컬럼에 시퀀스를 간접적으로 연결할 수 있다.

다음 예를 참조한다.

  • 첫째: 태스크라는 새 테이블을 생성한다.
1
2
3
4
CREATE TABLE tasks(
    id NUMBER PRIMARY KEY,
    title VARCHAR2(255) NOT NULL
);
  • 둘째: 태스크 테이블의 ID 컬럼에 대한 시퀀스를 생성한다.
1
CREATE SEQUENCE task_id_seq;
  • 셋째: 작업 테이블에 데이터를 삽입한다.
1
2
3
4
5
INSERT INTO tasks(id, title)
VALUES(task_id_seq.NEXTVAL, 'Create Sequence in Oracle');

INSERT INTO tasks(id, title)
VALUES(task_id_seq.NEXTVAL, 'Examine Sequence Values');
  • 넷째: 작업 테이블에서 데이터를 조회한다.
1
2
3
4
SELECT
    id, title
FROM
    tasks;

create-sequence-example

이 예에서 tasks 테이블은 task_id_seq 순서와 직접 연결되지 않는다.

3) ID 컬럼 예제를 통해 시퀀스 사용

오라클 12c에서는 ID 컬럼을 통해 시퀀스를 테이블 컬럼에 연결할 수 있다.

  • 첫째: 태스크 테이블을 삭제한다.
1
DROP TABLE tasks;
  • 둘째: ID 컬럼에 대한 ID 컬럼을 사용하여 태스크 테이블을 재생성한다.
1
2
3
4
CREATE TABLE tasks(
    id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    title VARCHAR2(255) NOT NULL
);

뒤에서 Oracle은 tasks 테이블의 id 컬럼과 연결되는 시퀀스를 생성한다.

Oracle이 id 컬럼에 대해 시퀀스를 자동으로 생성했기 때문에 Oracle 인스턴스에서 시퀀스 이름이 다를 수 있습니다.

identity-column

Oracle은 sys.idnseq$를 사용하여 테이블과 시퀀스 사이의 링크를 저장한다.

이 쿼리는 tasks 테이블과 ISEQ$$_74366 시퀀스의 연결을 반환한다.

1
2
3
4
5
6
7
8
9
SELECT
    a.name AS table_name,
    b.name AS sequence_name
FROM
    sys.idnseq$ c
    JOIN obj$ a ON c.obj# = a.obj#
    JOIN obj$ b ON c.seqobj# = b.obj#
WHERE
    a.name = 'TASKS';
  • 셋째: 작업 테이블에 일부 행을 삽입한다.
1
2
3
4
5
INSERT INTO tasks(title)
VALUES('Learn Oracle identity column in 12c');

INSERT INTO tasks(title)
VALUES('Verify contents of the tasks table');
  • 넷째: 작업 테이블에서 데이터를 조회한다.
1
2
3
4
SELECT
    id, title
FROM
    tasks;

oracle-identity-column-example

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.