오라클 순차적으로 넘버링하기

테이블을 생성하고 테스트를 할 경우가 생겨서 자료를 밀어넣다보니 넘버링을 할 필요가 생겼습니다.

 

데이터값은 아래와 같은 형식이었구요.

SEQ     PJT_CD        PJT_NM        VALUE 

        P0001           테스트1         10  

        P0002           테스트2         20 

        P0003           테스트3         30 

        P0004           테스트4         40 

        P0005           테스트5         50 

 

다른 테이블에 있는 데이터를 밀어넣다보니 시컨스를 따로 잡을 필요가 생기더군요. 약간의 삽질을 좀 했습니다. 간단한 방법을 두고 다른 방법을 찾다보니 잔머리만 늘어나네요.

 

다른테이블의 값을 셀렉트해서 인서트 하려다보니 넘버링을 제대로 하기가 힘들어서 셀렉트할때 지속적으로 증가되는 값을 넣어보려고 다른 방법을 찾아보려 하였습니다.

 

우선, SEQ 컬럼이 varchar2 형식이라 MAX값이 제대로 표기가 되지 않았습니다. VARCHAR2 형식에서 MAX값은 꼭 TO_NUMBER형식으로 변환해서 처리해주셔야 합니다.

 

SELECT MAX(TO_NUMBER(SEQ))+1 FROM DUAL 을 활용해서 업데이트에 활용하려고 했는데 아뿔싸 SEQ 값 자체가 없는데 어떻게 업데이트가 될까요...ㅠㅠ

 

그렇다고 NVL(MAX(TO_NUMBER(SEQ))+1,1) 이걸또 생각해서 쓰려니 지속적으로 증가하는 값이 필요한건데 SEQ값이 고정이라 의미가 없습니다.

 

그래서 생각한게 LEVEL 이었는데 이것또한 마찬가지였죠

SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 100

 

업데이트를 할때 지속적인 값을 넣을려고 하면 대상값이 있고 그값을 지속적으로 증가를 시켜야 하는데 그런게 없다는거죠.

 

위에 서술한건 이미 소트된 리스트를 다시 정렬할때 쓰이고 있습니다만 아무것도 없을때는 의미가 없죠. 해답은 ROWNUM 입니다.

 

ROWNUM은 게시판 페이지소팅에 기본적으로 쓰이는 함수입니다. SELECT하여 자료를 구축할때 이게 기억이 안나서 인서트하고나서 다시 업데이트를 하게 되었습니다.

 

데이터를 밀어넣을때는 그냥 ROWNUM을 쓰면 상관이 없지만 기존데이터의 순서를 맞출려면 힌트가 필요합니다.

 

1. 리넘버링을 위해서 인텍스를 만듭니다.

    CREATE INDEX 인덱스명 ON 테이블명(컬럼)

2. ROWNUM을 써서 UPDATE를 해줍니다.

    UPDATE /*+ INDEX(테이블명 인덱스명) */ 테이블명 SET = 컬럼명 = ROWNUM

    WHERE 컬럼명 > 0 ;

 

실행하시면 간단하게 리넘버링이 적용된걸 확인하실수 있습니다.