11_OBJECT(SEQUENCE)
시퀀스
* 자동으로 번호를 발생시켜주는 역할을 하는 객체 * 정수값을 자동으로, 순차적으로 생성해줌. * 예) 회원번호, 사번, 게시글번호 등을 채번(번호를 새로 부여)할 때 사용
시퀀스 생성 구문
[표현법] * CREATE SEQUENCE 시퀀스명; * START WITH 시작숫자 : 처음 발생시킬 시작값을 지정 * INCREMENT BY 증가값 : 한번에 몇씩 증가시킬건지 지정 * MAXVALUE 최대값 : 최대값 지정 * MINVALUE 최소값 : 최소값 지정 * CYCLE / NOCYCLE : 값의 순환여부를 지정 * CACHE 바이트 크기 / NOCACHE : 캐시메모리 사용 여부 지정 * => CACHE 바이트크기는 바이트크기만큼의 캐시메모리를 사용하겠다는 뜻 * * 주의할점 : 모든 설정들은 생략 가능 * 캐시메모리 : 미리 발생될 값들을 생성해서 저장해두는 임시메모리공간 매번 호출할때보다 새로이 번호를 생성하는 것보다 캐시메모리 공간에 미리 생성된 번호들을 저장해뒀다가 쓰는 것이 속도가 더 빠름. 단, DB접속이 끊기면 기존에 저장되어 있던 값들이 모두 날라감. (임시메모리 공간이라서)
-- 시퀀스 생성(모든 설정 생략)
CREATE SEQUENCE SEQ_TEST;
-- 시퀀스 생성 확인
SELECT * FROM USER_SEQUENCES;
-- USER_SEQUENCES : 현재 접속한 계정이 소유하고 있는 시퀀스들에 대한 정보 조회용 데이터 딕셔너리
-- 기본 설정값
-- MIN VALUE : 1
-- MAX VALUE : 9999999999999999999999999999
-- INCREMENT_BY : 1
-- CYCLE_FLAG : N
-- CACHE_SIZE : 20
-- 시퀀스 생성(모든 설정 적용)
CREATE SEQUENCE SEQ_EMPNO
START WITH 300
INCREMENT BY 5
MAXVALUE 310
NOCYCLE
NOCACHE;
시퀀스 사용 구문
* 번호를 발생시키는 구문 * 시퀀스명.CURRVAL : CURRNET VALUE. 현재 시퀀스의 값을 나타냄. * (가장 마지막으로 성공적으로 발생한 NEXTVAL값이 곧 CURRVAL이 됨) * 시퀀스명.NEXTVAL : 시퀀스 값을 증가시키고 그 증가된 시퀀스의 값을 내보내줌 * 기본의 시퀀스 값에서 INCREMENT BY 값만큼 증가된 값 * (시퀀스명.CURRVAL + INCREMENT BY 설정값 == 시퀀스명.NEXTVAL) * 주의사항 * 1) 시퀀스 생성 후 첫 CURRVAL 불가능 * 2) 시퀀스 생성 후 첫 NEXTVAL은 START WITH의 시작값으로 잡힘. * 3) CURRVAL은 가장 마지막에 성공적으로 수행한 NEXTVAL을 담아두는 변수의 개념임! * 4) MAXVALUE, MINVALUE 범위를 벗어난 값을 발생시킬수는 없음.
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL;
-- [오류] sequence SEQ_EMPNO.CURRVAL is not yet defined in this session
-- 한번이라도 NEXTVAL을 수행하지 않는 이상, CURRVAL을 수행할 수 없음.
-- (CURRVAL은 마지막으로 성공적으로 수행된 NEXTVAL의 값)
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL; -- 300
-- 처음 NEXTVAL을 수행하면, START WITH로 시작한 값이 출력됨.
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL; -- 300
-- 이 시점에서 CURRVAL이 300이라는 값으로 출력됨.
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL; -- 305
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL; -- 305
SELECT * FROM USER_SEQUENCES;
-- LAST_NUMBER : 다음번호 대기값
-- 현재 상황에서 NEXTVAR을 실행할 경우의 예상값을 담아줌.
-- 다음 NEXTVAL을 수행할 경우, 310이 된다는 뜻임.
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL; -- 310
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
-- [오류] sequence SEQ_EMPNO.NEXTVAL exceeds MAXVALUE and cannot be instantiated
-- 내가 지정한 MAXVALUE를 초과했기 때문에 발생하는 오류임.
시퀀스 변경 구문
* [표현법] * ALTER SEQUENCE 시퀀스명 * INCREMENT BY 증가값 * MAXVALUE * MINVALUE * CYCLE / NOCYCLE * CACHE 바이트크기 / NOCACHE ; * * START WITH는 변경 불가 => 이 경우, 그냥 시퀀스를 지우고 다시 만듬.
-- INCREMENET, MAXVALUE 변경
ALTER SEQUENCE SEQ_EMPNO
INCREMENT BY 10
MAXVALUE 400;
-- 잘 바뀌었나 확인
SELECT * FROM USER_SEQUENCES;
-- LAST NUMBER가 320으로 바뀜.
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL; -- 310
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL; -- 320 : 예상값대로 잘 나옴.
-- SEQUENCE 삭제하기
DROP SEQUENCE SEQ_EMPNO;
SELECT * FROM USER_SEQUENCES;
시퀀스 사용 예시
-- 매번 새로운 사번이 발생되는 시퀀스 발생
CREATE SEQUENCE SEQ_EID
START WITH 300;
-- INCREMENT의 기본값이 1이라 1씩 증가함.
-- CURRVAL : 아직 안나옴. NEXTVAL을 수행해야 나옴.
SELECT SEQ_EID.NEXTVAL
FROM DUAL; -- 300
-- 사원이 추가될 때, EMPLOYEE테이블에 INSERT
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES(SEQ_EID.NEXTVAL, '홍길동', '1', 'J2', 'S3',SYSDATE); -- 301
SELECT * FROM EMPLOYEE;
SELECT SEQ_EID.CURRVAL
FROM DUAL; -- 301
SELECT SEQ_EID.NEXTVAL
FROM DUAL; -- 302
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES(SEQ_EID.NEXTVAL, '고길동', '1', 'J2', 'S3',SYSDATE); -- 302
SELECT * FROM EMPLOYEE;
COMMIT;
Author And Source
이 문제에 관하여(11_OBJECT(SEQUENCE)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kojam9041/11OBJECTSEQUENCE저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)