본문 바로가기
Oracle/Index, Sequence, Synonym

데이터 베이스_ 오라클 [Sequence] 활용 2 currval, nextval

by Super Santj 2019. 7. 3.

새롭게 시컨스를 만들어서 테이블에 적용을 시켜보자.

활용_

우선 미리 만들어놓은 b_dept2 테이블의 데이터를 확인해 보자.

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU

여기서 insert를 할때 deptno 부서번호에 맞게 10씩 증가를 시키고, 시작값을 60으로 설정하여 시퀀스 옵션설정을 해야한다.

정리하자면, 시작값 60, 증가치 10 셋팅

시퀀스 형식을 참고 할수있는 사진

위 사진을 참고하여 옵션값을 셋팅 한다. 부서의 번호는 10000을 최대로, 60부터 10씩 증가하고 최대값에 도달할경우 반복하지않는것을 옵션으로 새로운 시퀀스를 생성하였다.

SQL> create sequence b_dept2_deptno2
  2  start with 60
  3  increment by 10
  4  maxvalue 10000
  5  nocycle
  6  nocache;

시퀀스가 생성되었습니다.

위와 같이 시퀀스를 셋팅하였기 때문에 부서번호 입력란에는 nextval 명령어를 호출 나머지 값엔 내가 입력하고싶은 값을 지정하여 아래와 같이 선언 하였다.

SQL> insert into b_dept2 values(b_dept2_deptno2.nextval,'TESTING','SEOUL');

1 개의 행이 만들어졌습니다.

그리고 결과값 호출 확인 작업

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL

6 개의 행이 선택되었습니다.

반복

SQL> insert into b_dept2 values(b_dept2_deptno2.nextval,'TESTING2','BUSAN');

1 개의 행이 만들어졌습니다.

SQL> select * from b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN

7 개의 행이 선택되었습니다.

위와 같이 반복적으로 값을 수정 및 호출 했을때 보이는것과 같이 이렇게 생성이 된다.

하지만 시퀀스의 단점이 있었으니..

**중요**

※시퀀스의 단점

시퀀스는 테이블당 딱 한개씩만 써야한다. A테이블에 사용하였다가 B테이블 C테이블에 사용할시 각 테이블마다 순서가 차례대로 부여되지않는다. 시퀀스는 시퀀스에서 정한 순서대로만 지정이 되기에 가능한 단독 테이블로 사용해야함.

시퀀스는 중복되지않게 일정하게 값을 부여하고자 사용하는것인데 2개 이상의 테이블에서 사용할경우 순서가 중간중간 빵꾸가 날수가있고 깔끔하게 순차적으로 나열이 되지 않는다.

시퀀스와 그룹함수를 접목 시키면 select max(deptno) from 테이블을 할시 최대값 +1(증가치)로 진행이되기때문에 중복될 위험을 줄일수가있는 SQL 구문이다.

**중요**

활용2_

시퀀스도 현재 오라클 테이블에 저장이 되고있음 (system dic) => user_sequences의 테이블에 저장이 되고있다. 그리하여 우리는 시퀀스 또한 VIEW 를 접목 시킬수가 있다.

우선 우리 시스템에 저장된 시퀀스를 호출해보자.

SQL> desc user_sequences
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 SEQUENCE_NAME    (시퀀스명)                 NOT NULL VARCHAR2(30)
 MIN_VALUE             (최소값)                  NUMBER
 MAX_VALUE            (최대값)                    NUMBER
 INCREMENT_BY      (증가값)            NOT NULL NUMBER
 CYCLE_FLAG                                         VARCHAR2(1)
 ORDER_FLAG                                         VARCHAR2(1)
 CACHE_SIZE                                NOT NULL NUMBER
 LAST_NUMBER      (현재 저장된 마지막값)          NOT NULL NUMBER

뷰를 이용하여 조회를 한다면,,

우선 뷰의 이름을 v_sequence_seq 로 지정한다는 전제하에 뷰 테이블을 생성해 보자.

SQL> create view v_sequence_seq
  2  as
  3  select sequence_name,min_value,max_value,increment_by,last_number
  4  from user_sequences;

뷰가 생성되었습니다.

아래와같이 생성이 되었다.

SQL> select * from v_sequence_seq;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY LAST_NUMBER
------------------------------ ---------- ---------- ------------ -----------
B_DEPT2_DEPTNO                          1 1.0000E+28            1          21
B_DEPT2_DEPTNO2                         1      10000           10          80
B_EMP5_EMPNO                            1 1.0000E+28            1           1

 

댓글