본문 바로가기
클라우드 활용 자바개발자 양성과정/02. 데이터베이스 활용

10. OBJECT(SEQUENCE)

by moca7 2024. 7. 24.

 

ㅁ < SEQUENCE 시퀀스 >

- 일련번호를 생성해주는 데이터베이스 객체

- 주로 기본키 컬럼값으로 사용됨. (회원번호, 사원번호, 게시글번호 등)

 

 

ㅁ 시퀀스 생성

 

CREATE SEQUENCE 시퀀스명                        //      이렇게만 해도 시퀀스는 생성됨.

[START WITH 시작숫자]                                    //      몇번부터 시작할지 지정 가능. (기본값1)

[INCREMENT BY 증가값]                                  //      몇씩 증가할지도 지정 가능. (기본값1)

[NOMAXVALUE | MAXVALUE 숫자]                  //      상한값 지정할 수도 있고, 안할 수도 있음. (기본값 겁나큼)

[NOMINVALUE | MINVALUE 숫자]                   //       하한값 지정할 수도 있고, 안할 수도 있음. (기본값 1)

 

[NOCYLE | CYCLE]                                           //       값 순환 여부 지정 (기본값 NOCYCLE)

[NOCACHE | CACHE 사이즈];                          //        캐시메모리 할당. (기본값 20)

 

 

- 모든 옵션 다 생략 가능. 기본값 있어서.

- NOMAXVALUE를 하지 않으면 겁나큰 기본값이 상한값이 됨.

이 상한값에 도달하면 다시 1부터 시작할지(순환할지) 여부를 지정해야함.

- 캐시메모리를 쓸건지 안쓸건지. 쓴다면 SIZE를 얼마나 쓸건지.

 

- 캐시메모리는 미리 발생될 값들을 생성해서 저장해두는 공간이다.

매번 호출시마다 새로이 숫자를 생성하는 것이 아니라 캐시상에 생성되어있는 값을 가져와서 사용한다.

이러면 속도가 빨라짐. 캐시 20이라하면 20개의 숫자를 미리 만들어 놓음.

그 후 내가 호출을 하면 캐시메모리의 값들을 그대로 가져옴.

- 단점은 캐시메모리에 있는 값들을 다 가져오기 전에 프로그램 종료 및 접속이 해제되면 캐시상에 만들어진 값들은 다 소멸됨. 재접속해서 시퀀스 재호출하면 다음 번호 발생시 중간에 값이 건너띄워진채로 보여짐.

- 근데 시퀀스는 고유하기만 하면 되는거라 중간에 값이 건너띄워져있어도 아무 상관 없음!

 

 

ㅁ 

- 테이블명 TB_

- 시퀀스명 SEQ_

- 뷰명 VW_

- 트리거명 TRG_

 

저것들을 앞이나 뒤에 붙임. 구분하려는 목적 혹은 예약어인 경우.

 

 

 

ㅁ 생성 예시

 

 

ㅇ 시퀀스 생성1

 

CREATE SEQUENCE SEQ_TEST;

 

 

- LAST_NUMBER가 시퀀스 실행하면 발생할 번호다.

 

 

 

ㅇ 시퀀스 생성2

 

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

 

 

- LAST_NUMBER가 NEXT_VAL하면 나올 값.

 

 

 

 

 

ㅇ 참고 - USER_SEQUENCES

- 이 계정이 가진 시퀀스들 보여줌.

 

SELECT *

FROM USER_SEQUNCES;

 

 

 

 

 

ㅁ 시퀀스 사용

 

시퀀스명.NEXTVAL     //   INCEREMENT BY 만큼 증가된 값을 매번 생성

시퀀스명.CURRVAL    //    현재 시퀀스값 (마지막으로 성공적으로 수행된 NEXTVAL)

 

 

SELECT SEQ_EMPNO.CURRVAL
FROM DUAL;

 

 

- 오류. CURRVAL을 이용하기 위해서는 최소 한번은 NEXTVAL을 수행시켜줘야 한다.

- CURRVAL은 마지막으로 수행된 NEXTVAL의 값을 저장해서 보여주는 임시값이다. 

 

 

 

 

- NEXTVAL 조회하면 300 나옴.

- 그 후 CURRVAL 조회하면 300 나옴.

 

- 그 다음 NEXTVAL 조회하면 305 나옴.

 

 

- 이 계정의 시퀀스 조회해보면 LAST_NUMBER가 310. 다음 NEXTVAL 조회하면 310이 나온다. 

 

 

 

- 310인데 또 NEXTVAL을 또 조회하면 MAXVALUE가 310이라서 오류 난다.

- NOCYCLE로 순환 안되게 해서 오류 남. 

순환되게 했으면 MINVALUE부터 다시 시작함.

 

 

 

 

ㅁ 시퀀스 변경

 

ALTER SEQUENCE 시퀀스명

[INCREMENT BY 증가값]                                  //      몇씩 증가할지도 지정 가능. (기본값1)

[NOMAXVALUE | MAXVALUE 숫자]                  //      상한값 지정할 수도 있고, 안할 수도 있음. (기본값 겁나큼)

[NOMINVALUE | MINVALUE 숫자]                   //       하한값 지정할 수도 있고, 안할 수도 있음. (기본값 1)

 

[NOCYLE | CYCLE]                                           //       값 순환 여부 지정 (기본값 NOCYCLE)

[NOCACHE | CACHE 사이즈];                          //        캐시메모리 할당. (기본값 20)

 

 

- "START WITH 시작 숫자"는 변경 불가.

 

 

 

ㅇ 시퀀스 변경

 

ALTER SEQUENCE SEQ_EMPNO
    INCREMENT BY 10
    MAXVALUE 400;

 

 

- 아까 CURRVAL이 310에서 멈췄다. 10씩 증사키켜서 NEXTVAL이 320이 나온다.

 

 

 

ㅁ 시퀀스 삭제

 

DROP SEQUENCE 시퀀스명;

 

 

 

ㅁ 시퀀스 사용 예시

 

 

ㅇ 신입사원이 추가될 대마다 매번 새로운 사번 부여

 

 

CREATE SEQUENCE SEQ_EID
    START WITH 400
    NOCACHE;

 

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
              VALUES(SEQ_EID.NEXTVAL, '홍길동', '123456-1234567', 'J7', SYSDATE);

 

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
              VALUES(SEQ_EID.NEXTVAL, '김말똥', '123456-1234567', 'J7', SYSDATE);

 

SELECT *

FROM EMPLOYEE;

 

- EMPLOYEE 테이블을 조회하면 사번 400, 401번으로 홍길동, 김말똥

사원이 추가되어 있음을 확인할 수 있다. 

 

 

 

ㅇ 직급데이터 추가시 직급코드로 활용할 시퀀스

- 테이블마다 시퀀스도 하나씩 따로 만들어줘야 한다.

(아까 예제랑 테이블이 달라졌으니 시퀀스도 달라짐)

 

 

CREATE SEQUENCE SEQ_JCODE

    START WITH 8

    MAXVALUE 9

    NOCACHE;

 

 

- JOB_CODE 컬럼은 CHAR(2 BYTE)라서 J9는 되지만 J10부터는 오류난다.

- 현재 J7까지 있음.

 

 

INSERT INTO JOB VALUES('J' || SEQ_JCODE.NEXTVAL, '신입');

INSERT INTO JOB VALUES('J' || SEQ_JCODE.NEXTVAL, '인턴');

 

- 시퀀스는 숫자이므로 연결연산자, LPAD, CONCAT 등이 가능하다.

 

 

 

 

ㅁ COMMIT하고 종료.

 

ㅁ COMMIT 또는 ROLLBACK을 안하고 SQL DEVELOPER 창을 끄려고하면 아래와 같이 뜸.