시퀀스
시퀸스 개념 이해와 시퀀스 생성
CREATE SEQUENCE sequence_name
[START WITH n] ①
[INCREMENT BY n] ②
[{MAXVALUE n | NOMAXVALUE}] ③
[{MINVALUE n | NOMINVALUE}] ④
[{CYCLE | NOCYCLE}] ⑤
[{CACHE n | NOCACHE}] ⑥
① START WITH
② INCREMENT BY
연속적인 시퀀스 번호의 증가치를 지정할 때 사용됩니다. 만일 1씩 증가하는 시퀀스를 생성하려면 INCREMENT BY
1이라고 기술하면 됩니다.
⑤ CYCLE | NOCYCLE
CREATE SEQUENCE DEPT_DEPTNO_SEQ
INCREMENT BY 10
START WITH 10;
시작 값이 1이고 1씩 증가하는 시퀀스 EMP_SEQ을 합니다.
DESC USER_SEQUENCES
SEQUENCE_NAME은 시퀀스 객체의 이름을 저장하고
MIN_VALUE는 최소값, MAX_VALUE는 최대값.
INCREMENT_BY는 증가치에 대한 정보를 가지고 있으며,
CYCLE_FLAG는 CYCLE옵션을 사용하는지, 하지 않는지에 대한 정보를 가지며
LAST_NUMBER는 마지막 숫자 값을 가지고 있습니다.
2. 데이터 딕셔너리 USER_SEQUENCES로 현재 사용 중인 시퀀스 객체의 정보를 살펴봅시다.
SELECT SEQUENCE_NAME, MIN_VALUE, MAX_VALUE,
INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
지금까지 생성한 시퀀스 객체는 DEPT_DEPTNO_SEQ 한 개이기에 데이터 딕셔너리에도 DEPT_DEPTNO_SEQ
시퀀스객체 하나에 대한 정보만 나타납니다.
INCREMENT_BY가 증가치를 지정하는 컬럼으로 10씩 증가한다고 증가치가
설치되어 있고 MIN_VALUE와 MAX_VALUE, CYCLE 옵션 값은 따로 지정하지
않았으므로 기본 값인 1과 1027, N(사이클을 사용하지 않겠다)으로 지정되어
있습니다.
CURRVAL, NEXTVAL
CURRVAL : 현재 값을 반환한다.
NEXTVAL : 현재 시퀀스값의 다음 값을 반환한다
NEXTVAL, CURRVAL을 사용할 수 있는 경우와 사용할 수 없는 경우를 살펴봅시다.
사원 번호를 생성하는 시퀀스 객체를 생성하여 이를 기본 키인 사원 번호에 사용하여 사용자가 새로운 사원을 추가할 때마다 유일한 사원번호를 INSERT 해야 하는 번거로움을 줄입시다.
1. 시작 값이 1이고 1씩 증가하고, 최댓값이 100000이 되는 시퀀스 EMP_SEQ 생성합니다.
CREATE SEQUENCE EMP_SEQ
START WITH 1
INCREMENT BY 1
MAXVALUE 100000 ;
2. 이번에는 생성된 시퀀스를 사용하기 위해서 사원 번호를 기본 키로 설정하여 EMP01란 이름으로 새롭게 생성합시다.
DROP TABLE EMP01;
CREATE TABLE EMP01(
EMPNO NUMBER(4) PRIMARY KEY,
ENAME VARCHAR(10),
HIREDATE DATE
);
3. 사원 번호를 저장하는 EMPNO 컬럼은 기본 키로 설정하였으므로 중복된 값을 가질 수 없습니다. 다음은 생성한 EMP_SEQ 시퀀스로부터 사원번호를 자동으로 할당받아 데이터를 추가하는 문장입니다.
INSERT INTO EMP01
VALUES(EMP_SEQ.NEXTVAL, 'JULIA' , SYSDATE);
<실습하기> 뷰 정의하기
뷰를 생성하려는데 다음과 같이 권한을 설정하였다면 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 출력하기 위한 SELECT문을 하나의 뷰로 다시 정의해 봅시다.
CREATE VIEW EMP_VIEW30
AS
SELECT EMPNO, ENAME, DEPTNO
FROM EMP_COPY
WHERE DEPTNO=30;
2. 뷰를 생성할 때 컬럼 이름을 명시하지 않으면 뷰(EMP_VIEW30)를 정의하는 기본 테이블(EMP_COPY)의 컬럼 명을 상속받아 사용합니다. 다음은 생성된 뷰의 구조를 살펴봅시다.
DESC EMP_VIEW30
3.데이터를 추가하면서 EMP_SEQ 시퀀스로부터 사원번호를 자동으로 할당받았는지 EMP01 테이블의 내용을 확인합시다.
SELECT * FROM EMP01;
<탄탄히 다지기>
1.1 DEPTNO 컬럼에 유일한 값을 가질 수 있도록 시퀀스 객체 생성(시퀀스 이름 : DEPT_EXAMPLE_SEQ)해 봅시다.
1.2 새로운 로우를 추가할 때마다 시퀀스에 의해서 다음과 같이 부서 번호가 자동 부여되도록 해 봅시다.
<실습하기> 시퀀스 제거
DROP SEQUENCE DEPT_DEPTNO_SEQ;
<시컨스 수정 >
-시퀀스를 제거한 후 확인까지 해보았습니다. 이번에는 시퀀스를 변경해 봅시다.
ALTER SEQUENCE sequence_name
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
1. 시퀀스는 최대값을 지정하지 않으면 기본적으로 1027으로 지정됩니다. 사용자가 임의로 최대값을 지정할
수 있는데MAXVALUE에 값을 지정하면 됩니다. 10부터 10씩 증가하면서 최대 30까지의 값을 갖는 시퀀스를
생성합시다.
DROP SEQUENCE DEPT_DEPTNO_SEQ;
CREATE SEQUENCE DEPT_DEPTNO_SEQ
START WITH 10
INCREMENT BY 10
MAXVALUE 30;
2. 부서 번호를 계속 생성하다 보면 최대값을 넘게 됩니다. 최대값을 넘을 때까지 시퀀스를 생성해 봅시다.
이때 CYCLE 옵션을 지정하지 않으면 기본값으로 NOCYCLE를 갖게 되므로 오류가 발생하게 됩니다.
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
SELECT DEPT_DEPTNO_SEQ.NEXTVAL FROM DUAL;
3. ALTER SEQUENCE문을 사용하여 사용 중이던 DEPT_DEPTNO_SEQ 시퀀스의 최대값을 수정해 봅시다.
ALTER SEQUENCE DEPT_DEPTNO_SEQ
MAXVALUE 1000;
4. USER_SEQUENCES 를 조회하면 시퀀스가 수정되었는지 확인할 수 있습니다.
SELECT SEQUENCE_NAME, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG
FROM USER_SEQUENCES;
'DATABASE' 카테고리의 다른 글
[DATABASE][Developer Downloads ] (0) | 2018.04.23 |
---|---|
[DATABASE][프로시저(PROCEDURE)] (0) | 2018.04.23 |
[DATA BASE][인덱스] (0) | 2018.04.20 |
[DATABASE][SCHEMA] (0) | 2018.04.20 |
[DATABASE][view] (0) | 2018.04.20 |