본문 바로가기

아이티/oracle&DB

랜덤하게 시리얼번호(serial number) 생성하기

랜덤하게 시리얼번호(serial number)혹은 씨디키(cd-key)를 생성해 보자.

아래 쿼리는 간단하게 영문대문자와 숫자로만 구성된 20자리의 랜덤한 문자열을 :n개 만큼 생성한다.

만들어지는 문자열의 경우의 수는 쉽게 계산할 수 있듯이 36^20 = 1.336.. x 10^31 가지가 된다.

문자열에 영문대문자와 숫자만이 나올 수 있도록 해주는 decode 함수의 역할을 주목해 보자.


SELECT      MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 1, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 2, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 3, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 4, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 5, val))
         || '-'
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 6, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 7, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 8, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 9, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 10, val))
         || '-'
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 11, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 12, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 13, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 14, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 15, val))
         || '-'
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 16, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 17, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 18, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 19, val))
         || MIN (DECODE (MOD (ROWNUM - 1, 20) + 1, 20, val)) str          
    FROM (SELECT CHR (DECODE (SIGN (rand - 10), -1, rand + 48, rand + 55))
                                                                          val
            FROM (SELECT     TRUNC (DBMS_RANDOM.VALUE (0, 36)) rand
                        FROM DUAL
                  CONNECT BY LEVEL <= 20 * :N)) --이부분이 어려움!!
GROUP BY TRUNC ((ROWNUM - 1) / 20)

#간단한 DECODE,DBMS_RANDOM, MOD,MIN,CHR 만으로 만들어지는 랜덤cd-key만들기 함수..
이해해보자~ -_-;; 보기보단 쉽다..




반응형