반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - OBJECT(SEQUENCE), 시퀀스 생성구문, 사용구문, 변경 본문

Oracle SQL/Oracle SQL

Oracle SQL - OBJECT(SEQUENCE), 시퀀스 생성구문, 사용구문, 변경

yeonee 여니 2023. 6. 14. 13:44
728x90
반응형
SMALL

안녕하세요.
https://blog.naver.com/sysysy0302 여니입니다:)

 

/*
    <시퀀스 SEQUENCE>
    
    자동으로 번호를 발생시켜주는 역할을 하는 객체 ★(자동번호 부여기)
    정수값을 자동으로 순차적으로 발생시켜줌
    
    EX) 주차번호, 회원번호, 사번, 게시글번호등
    => 순차적으로 겹치지 않는 숫자로 채번할 때 사용할 예정
    
    1. 시퀀스객체 생성 구문
    
    [표현법]
    CRATE SEQUENCE 시퀀스명
    START WITH 시작 숫자 => 생략 가능, 처음발생시킬 시작값 기본값은 1
    INCREMENT BY 증가값 => 생략 가능 기본값은 1씩 증가, 한번 시퀀스 증가할때마다 몇씩 증가할건지 결정
    MAXVALUE 최대값 => 생략가능, 최대값 지정
    MINVALUE 최소값 => 생략가능, 최소값 지정
    CYCLE/NOCYCLE => 생략가능, 값의 순환여부를 결정
    CACHE 바이트크기 / NOCACHE => 생략가능, 캐시메모리 여부 지정
                                기본 캐시 사이즈는 20BYTE
    * 캐시메모리
    시퀀스로부터 미리 발생될 값들을 생성해서 저장해두는 공간
    매번 호출할때마다 새로이 번호를 생성하는 것보다
    캐시메모리 공간에 미리 생성된 값을을 가져다 쓰게 되면 훨씬 속도가 빠름
    단, 접속이 끊기고 나서 재접속 후 기존에 생성되어있던 값들은 날라가고 없음
*/

CREATE SEQUENCE SEQ_TEST;

-- 현재 접속한 계정이 소유하고 있는 시퀀스에 대한 정보 조회용 데이터 딕셔너리
SELECT * FROM USER_SEQUENCES;

CREATE SEQUENCE SEQ_EMPNO
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;

/*
    2. 시퀀스 사용 구문
    
    시퀀스명.CURRVAL : 현재 시퀀스의 값(마지막으로 성공적으로 발생된 NEXTVAL의 값)
    시퀀스명.NEXTVAL : 현재 시퀀스의 값을 증가시키고, 그 증가된 시퀀스의 값
                     == 시퀀스명.CURRVAL + INCREMENT_BY 값만큼 증가된 값
    
    단, 시퀀스 생성 후 첫번째 NEXTVAL은 START WITH으로 지정된 시작값으로 발생된다.
        시퀀스 생성 후 NEXTVAL이 호출되지 않은 시점에서 CURRVAL은 수행이 불가능함.
*/
SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
-- ORA-08002: sequence SEQ_EMPNO.CURRVAL is not yet defined in this session
-- 시퀀스가 생성되고 나서 NEXTVAL을 한번이라도 수행하지 않는 이상 CURRVAL을 수행할수 없기 때문에 발생된 에러
-- CURRVAL은 마지막으로 성공적으로 수행된 NEXTVAL의 값을 저장해서 보여주는 임시값이기 때문

SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 300
SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 300

SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 305
--NEXTVAL 1회 실행 후 -> LAST_NUMBER: 305
--NEXTVAL 2회 실행 후 -> LAST_NUMBER: 310

SELECT * FROM USER_SEQUENCES; 
-- LAST_NUMBER : 앞으로 NESTVAL을 한번 수행할 경우 얻어올수 있는 예정값.

SELECT SEQ_EMPNO.CURRVAL FROM DUAL;

-- CURRVAL == 310 == MAXVALUE
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; 
-- ORA-08004: sequence SEQ_EMPNO.NEXTVAL exceeds MAXVALUE and cannot be instantiated
-- 지정한 MAXVALUE값을 초과했기 때문에 오류 발생

SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
-- 마지막으로 수행된 NEXTVAL값

/*
    3. 시퀀스 변경
    
    [표현법]   -- 'START WITH 시작 숫자' 구문 삭제 
    ALTER SEQUENCE 시퀀스명
    INCREMENT BY 증가값 => 생략 가능 기본값은 1씩 증가, 한번 시퀀스 증가할때마다 몇씩 증가할건지 결정
    MAXVALUE 최대값 => 생략가능, 최대값 지정
    MINVALUE 최소값 => 생략가능, 최소값 지정
    CYCLE/NOCYCLE => 생략가능, 값의 순환여부를 결정
    CACHE 바이트크기 / NOCACHE => 생략가능, 캐시메모리 여부 지정
                                기본 캐시 사이즈는 20BYTE
    
    => START WITH은 변경 불가능 : 정 바꾸고싶다면 시퀀스를 삭제했다가 재생성 해줘야함.
*/
ALTER SEQUENCE SEQ_EMPNO 
INCREMENT BY 10
MAXVALUE 400;

SELECT * FROM USER_SEQUENCES;

SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 310
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 320 == 310 + 10
-- 중간에 시퀀스가 변경되더라도 CURRVAL값은 유지된다.

DROP SEQUENCE SEQ_EMPNO;

-- 매번 새로운 사번이 발생되는 시퀀스 생성(시퀀스명 : SEQ_EID)
CREATE SEQUENCE SEQ_EID
START WITH 300
INCREMENT BY 1
MAXVALUE 400;

-- 사원이 추가될때 실행할 INSERT문
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES (SEQ_EID.NEXTVAL, '소연', '123456-1234567', 'J2', 'S3', SYSDATE);

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES (SEQ_EID.NEXTVAL, '고길동', '123456-1234567', 'J2', 'S3', SYSDATE);

SELECT * FROM EMPLOYEE;

-- 시퀀스가 가장 많이 사용되는 위치는 INSERT문의 PK값에 넣을때

-- 사용할수 없는 구문
-- VIEW의 SELECT문
-- DISTINCT가 포함된 SELECT문
-- GROUP BY HAVING ORDER BY가 있는 SELECT문
-- 서브쿼리안에서 X
-- CREATE TABLE, ALTER TABLE의 DEFAULT 값으로도 사용이 불가능함

728x90
반응형
LIST