오라클교육강좌,SQL교육,오라클 시퀀스(Oracle Sequencs)
http://ojc.asia/bbs/board.php?bo_table=LecOracle&wr_id=290
ojc.asia
시퀀스sequence는 다중 사용자 환경에서 사용하는 숫자(일련번호) 자동 생성기 입니다. 주로 PK primary key, UKunique key 컬럼 값을 유일하게 자동 생성하는 경우에 사용됩니다.
트랜잭션 내에서 시퀀스가 생성되어 사용되다가 롤백 되는 경우에 다음 시퀀스 번호는 SKIP 될 수 있습니다.
테이블 또는 컬럼과는 독립적으로 생성되는 스키마 오브젝트로 생성 및 삭제 됩니다.
시퀀스.CURRVAL : 시퀀스의 현재 값을 리턴 합니다.
시퀀스.NEXTVAL : 시퀀스를 증가시키고 다음값을 리턴 합니다.
[기본형식]
CREATE SEQUENCE sequence_name [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]
|
시퀀스를 생성 후 딕셔너리 뷰에서 확인을 하고 INSERT문에서 활용을 한 후 삭제해 보겠습니다.
실습
시퀀스를 생성 합니다.
8000부터 시작해서 1 씩 증가하는 시퀀스를 생성해 보세요. |
CREATE SEQUENCE SEQ_EMP_EMPNO START WITH 8000 INCREMENT BY 1;
<실행결과>
Sequence SEQ_EMP_EMPNO이(가) 생성되었습니다.
생성한 시퀀스를 딕셔너리 뷰에서 확인을 합니다. USER_SEQUENCES 뷰에서 사용자가 생성한 시퀀스 정보를 조회 합니다.
SEQ_EMP_EMPNO 시퀀스의 이름, 증분 값, 캐시사이즈, 마지막 생성 번호를 조회 하세요. |
SELECT SEQUENCE_NAME, INCREMENT_BY, CACHE_SIZE, LAST_NUMBER FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ_EMP_EMPNO';
<실행결과>
SEQUENCE_NAME | INCREMENT_BY | CACHE_SIZE | LAST_NUMBER | |
1 | SEQ_EMP_EMPNO | 1 | 20 | 8000 |
시퀀스 생성시 시작값을 8000으로 부여해서 마지막 생성 번호는 8000으로 되어 있음을 확인할 수 있습니다.
생성한 시퀀스의 현재 값을 조회 합니다.
SEQ_EMP_EMPNO 시퀀스의 현재 값(CURRVAL)을 조회 하세요. |
SELECT SEQ_EMP_EMPNO.CURRVAL FROM DUAL;
<실행결과>
ORA-08002: 시퀀스 SEQ_EMP_EMPNO.CURRVAL은 이 세션에서는 정의 되어 있지 않습니다.
생성된 시퀀스는 최초 한번은 NEXTVAL을 해야만 CURRVAL 값을 조회할 수 있습니다.
SEQ_EMP_EMPNO.NEXTVAL해 보겠습니다.
SEQ_EMP_EMPNO 시퀀스의 다음값을(NEXTVAL)을 조회 하세요. |
SELECT SEQ_EMP_EMPNO.NEXTVAL FROM DUAL;
<실행결과>
NEXTVAL | |
1 | 8000 |
NEXTVAL을 했지만 최초 시작 값 8000이 조회 됩니다.시퀀스 생성 후 최초 NEXTVAL을 하면 생성시 부여한 START WITH 값이 조회 됩니다. 그 이후부터는 NEXTVAL을 하면 1 씩 증가 합니다.
다시 SEQ_EMP_EMPNO.NEXTVAL 후 시퀀스의 현재 값(CURRVAL)을 조회 해 보겠습니다.
SEQ_EMP_EMPNO 시퀀스의 다음값을(NEXTVAL)을 조회 하세요. |
SELECT SEQ_EMP_EMPNO.NEXTVAL FROM DUAL;
<실행결과>
NEXTVAL | |
1 | 8001 |
SEQ_EMP_EMPNO 시퀀스의 현재값을(CURRVAL)을 조회 하세요. |
SELECT SEQ_EMP_EMPNO.CURRVAL FROM DUAL;
<실행결과>
CURRVAL | |
1 | 8001 |
SEQ_EMP_EMPNO 시퀀스를 이용하여 EMP 테이블에 데이터를 입력해 보겠습니다. 현재 시퀀스의 CURRVAL 값은 8001 입니다.
SEQ_EMP_EMPNO 시퀀스를 이용하여 EMP 테이블에 2건의 데이터를 입력 합니다. |
INSERT INTO EMP (EMPNO, ENAME) VALUES (SEQ_EMP_EMPNO.NEXTVAL, '홍길동');
INSERT INTO EMP (EMPNO, ENAME) VALUES (SEQ_EMP_EMPNO.NEXTVAL, '김길동');
COMMIT;
EMPNO는 처음 INSERT 문에 의해 8002가 되고 두번째 INSERT문에 의해서는 8003이 됩니다.
EMP 테이블의 데이터를 조회해 보겠습니다.
EMP 테이블에서 이름(ename)에 “길동” 이라는 문자열이 포함된 사원을 조회 하세요. |
SELECT EMPNO, ENAME FROM EMP
WHERE ENAME LIKE '%길동%';
<실행결과>
EMPNO | ENAME | |
1 | 8002 | 홍길동 |
2 | 8003 | 김길동 |
DROP SEQUENCE 명령으로 시퀀스를 삭제해 보겠습니다.
SEQ_EMP_EMPNO 시퀀스를 삭제 하세요. |
DROP SEQUENCE SEQ_EMP_EMPNO;
<실행결과>
Sequence SEQ_EMP_EMPNO이(가) 삭제되었습니다.
다음과 같은 경우에는 시퀀스를 삭제 할 수 없습니다.
1. CREATE TABLE EMP_TEST (
EMPNO NUMBER DEFAULT SEQ_EMP_EMPNO.NEXTVAL
)
위 구문은 오라클12C 이전 버전에서는 오류가 발생 합니다. 12C 이상에서는 사용 가능 합니다.
2. SELECT DISTINCT SEQ_EMP_EMPNO.NEXTVAL FROM DUAL
DISTINCT와 함께 시퀀스 값을 사용할 수 없습니다.
3. SELECT SUM(SAL) FROM EMP GROUP BY SEQ_EMP_EMPNO.NEXTVAL
시퀀스는 GROUP BY 절에 사용될 수 없습니다.
https://www.youtube.com/playlist?list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS
www.youtube.com
#ORACLE교육, #오라클교육, #SQL교육, #오라클시퀀스, #시퀀스, #OracleSequence, #Sequence
ORACLE교육, 오라클교육, SQL교육, 오라클시퀀스, 시퀀스, OracleSequence, Sequence