시퀀스
* 자동으로 번호를 발생시켜주는 역할을 하는 객체
* 정수값을 자동으로, 순차적으로 생성해줌.
* 예) 회원번호, 사번, 게시글번호 등을 채번(번호를 새로 부여)할 때 사용
시퀀스 생성 구문
[표현법]
* CREATE SEQUENCE 시퀀스명;
* START WITH 시작숫자 : 처음 발생시킬 시작값을 지정
* INCREMENT BY 증가값 : 한번에 몇씩 증가시킬건지 지정
* MAXVALUE 최대값 : 최대값 지정
* MINVALUE 최소값 : 최소값 지정
* CYCLE / NOCYCLE : 값의 순환여부를 지정
* CACHE 바이트 크기 / NOCACHE : 캐시메모리 사용 여부 지정
* => CACHE 바이트크기는 바이트크기만큼의 캐시메모리를 사용하겠다는 뜻
*
* 주의할점 : 모든 설정들은 생략 가능
* 캐시메모리 : 미리 발생될 값들을 생성해서 저장해두는 임시메모리공간
매번 호출할때보다 새로이 번호를 생성하는 것보다
캐시메모리 공간에 미리 생성된 번호들을 저장해뒀다가 쓰는 것이 속도가 더 빠름.
단, DB접속이 끊기면 기존에 저장되어 있던 값들이 모두 날라감.
(임시메모리 공간이라서)
CREATE SEQUENCE SEQ_TEST;
SELECT * FROM USER_SEQUENCES;
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;
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL;
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL;
SELECT * FROM USER_SEQUENCES;
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
시퀀스 변경 구문
* [표현법]
* ALTER SEQUENCE 시퀀스명
* INCREMENT BY 증가값
* MAXVALUE
* MINVALUE
* CYCLE / NOCYCLE
* CACHE 바이트크기 / NOCACHE ;
*
* START WITH는 변경 불가 => 이 경우, 그냥 시퀀스를 지우고 다시 만듬.
ALTER SEQUENCE SEQ_EMPNO
INCREMENT BY 10
MAXVALUE 400;
SELECT * FROM USER_SEQUENCES;
SELECT SEQ_EMPNO.CURRVAL
FROM DUAL;
SELECT SEQ_EMPNO.NEXTVAL
FROM DUAL;
DROP SEQUENCE SEQ_EMPNO;
SELECT * FROM USER_SEQUENCES;
시퀀스 사용 예시
CREATE SEQUENCE SEQ_EID
START WITH 300;
SELECT SEQ_EID.NEXTVAL
FROM DUAL;
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES(SEQ_EID.NEXTVAL, '홍길동', '1', 'J2', 'S3',SYSDATE);
SELECT * FROM EMPLOYEE;
SELECT SEQ_EID.CURRVAL
FROM DUAL;
SELECT SEQ_EID.NEXTVAL
FROM DUAL;
INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, SAL_LEVEL, HIRE_DATE)
VALUES(SEQ_EID.NEXTVAL, '고길동', '1', 'J2', 'S3',SYSDATE);
SELECT * FROM EMPLOYEE;
COMMIT;