전체 방문자
오늘
어제
21종
종이의 코딩 공부방
21종
  • 분류 전체보기 (171)
    • JAVA (64)
    • Springboot (46)
      • 블로그만들기 (45)
    • Database (60)
      • Oracle (60)
    • 프로젝트 3 (CELOVER) (0)
    • 개발서버 구축 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
21종

종이의 코딩 공부방

Database/Oracle

[Oracle] OBJECT(2) - SEQUENCE

2023. 8. 7. 10:10

< 시퀀스 SEQUENCE >

자동으로 번호 발생시켜주는 역할을 하는 객체
정수값을 순차적으로 일정값씩 증가시키면서 생성해줌 (기본적으로는 1씩 증가)

EX) 회원번호, 사원번호, 게시글번호 등 절대 겹쳐서는 안되는 데이터들..


1. 시퀀스 객체 생성

[표현식]
CREATE SEQUENCE 시퀀스명

[상세 표현식]
CREATE SEQUENCE 시퀀스명
[START WITH 시작숫자]           -- 처음 발생시킬 시작값 지정 (기본값 1)
[INCREMENT BY 숫자]            -- 몇 씩 증가시킬껀지 (기본값 1)
[MAXVALUE 숫자]                -- 최대값 지정 (기본값 겁나큼...)
[MINVALUE 숫자]                -- 최소값 지정 (기본값 1)
[CYCLE|NOCYCLE]               -- 값 순환 여부 지정 (기본값 NOCYCLE) => 최대값 찍고 처음부터 다시 돌아와서 시작할 수 있게함
[NOCACHE|CACHE 바이트크기]      -- 캐시메모리 할당 (기본값 CACHE 20)

* 캐시메모리 : 임시공간
             미리 발생될 값들을 생성해서 저장해두는 공간
             매번 호출될 때마다 번호를 생성하는게 아니라
             캐시 메모리 공간에 미리 생성된 값들을 가져다 쓸 수 있음(속도가 빨라짐)
             접속이 해체되면 => 캐시 메모리에 미리 만들어둔 번호들은 다 날라감
             번호가 일정하게 부여 안될 수 있으니 확인을 잘 해야함!!

테이블명 : TB_
뷰명    : VW_
시퀀스  : SEQ_
트리거  : TRG_
CREATE SEQUENCE SEQ_TEST;

-- [참고] 현재 계정이 소유하고 있는 시퀀스들의 구조를 보고자 할 때
SELECT * FROM USER_SEQUENCES;

CREATE SEQUENCE SEQ_EMPNO
START WITH 300 -- 300부터 시작
INCREMENT BY 5 -- 5씩 증가
MAXVALUE 310 -- 310이 최대
NOCYCLE
NOCACHE;

2. 시퀀스 사용

시퀀스명.CURRVAL : 현재 시퀀스 값 (마지막으로 성공적으로 수행된 NEXTVAL의 값)
시퀀스명.NEXTVAL : 시퀀스값에 일정값을 증가시켜서 발생된 값 
                 현재 시퀀스 값에서 INCREMENT BY 값 만큼 증가된 값 
                 == 시퀀스명.CURRVAL + INCREMENT BY

SELECT SEQ_EMPNO.CURRVAL FROM DUAL;
-- ORA-08002: sequence SEQ_EMPNO.CURRVAL is not yet defined in this session
-- *Action:   select NEXTVAL from the sequence before selecting CURRVAL

 

NEXTVAL를 단 한번도 수행하지 않는 이상 CURRVAL 할 수 없음!!
왜? 마지막으로 성공적으로 수행된 NEXTVAL 값이기 때문!!

 

-- SELECT 여러번 치지말기!!!!!!!!
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 300
SELECT SEQ_EMPNO.CURRVAL FROM DUAL; -- 300 : 마지막으로 성공한 NEXTVAL의 값

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

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

SELECT * FROM USER_SEQUENCES;

SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 지정한 MAXVALUE 값 초과했기 때문에 오류 발생! (실패!)
SELECT SEQ_EMP_NO.CURRVAL FROM DUAL;

3. 시퀀스 구조 변경 

ALTER SEQUENCE 시퀀스명
[INCREMENT BY 숫자]            -- 몇 씩 증가시킬껀지 (기본값 1)
[MAXVALUE 숫자]                -- 최대값 지정 (기본값 겁나큼...)
[MINVALUE 숫자]                -- 최소값 지정 (기본값 1)
[CYCLE|NOCYCLE]               -- 값 순환 여부 지정 (기본값 NOCYCLE) => 최대값 찍고 처음부터 다시 돌아와서 시작할 수 있게함
[NOCACHE|CACHE 바이트크기]      -- 캐시메모리 할당 (기본값 CACHE 20)

** START WITH 는 변경 불가!!!
ALTER SEQUENCE SEQ_EMPNO
    INCREMENT BY 10
    MAXVALUE 400;
                 
SELECT SEQ_EMPNO.NEXTVAL FROM DUAL; -- 310 + 10 => 320

시퀀스 삭제 

DROP SEQUENCE SEQ_EMPNO;

사원번호로 활용할 시퀀스 생성

CREATE SEQUENCE SEQ_EID
START WITH 400
NOCACHE;

INSERT
    INTO EMPLOYEE
        (
          EMP_ID
        , EMP_NAME
        , EMP_NO
        , JOB_CODE
        , SAL_LEVEL
        , HIRE_DATE
        )
  VALUES
       (
         SEQ_EID.NEXTVAL
       , '홍길동'
       , '111111-1111111'
       , 'J7'
       , 'S1'
       , SYSDATE
       );

INSERT
    INTO EMPLOYEE
        (
          EMP_ID
        , EMP_NAME
        , EMP_NO
        , JOB_CODE
        , SAL_LEVEL
        , HIRE_DATE
        )
  VALUES
       (
         SEQ_EID.NEXTVAL
       , '차은우'
       , '111111-2111111'
       , 'J6'
       , 'S1'
       , SYSDATE
       );

SELECT * FROM EMPLOYEE;

 

    'Database/Oracle' 카테고리의 다른 글
    • [Oracle] OBJECT(3) - TRIGGER
    • [Oracle] PL/SQL
    • [Oracle] OBJECT(1) - VIEW
    • [Oracle] TCL(TRANSACTION CONTROL LANGUAGE)
    21종
    21종
    코딩 공부한 것 정리하려고 만든 블로그

    티스토리툴바