[Oracle] 랜덤 함수, 날짜, 이름

랜덤 함수

DBMS_RANDOM.VALUE
- 랜덤한 숫자를 생성한다
- Syntax : DBMS_RANDOM.VALUE(low IN NUMBER, high IN NUMBER)
- 파라미터 low는 최소범위, high는 최대 범위 값이다

정수로만 1000~10000 사이의 임의의 수를 10개를 생성해 보자
SELECT CEIL(DBMS_RANDOM.VALUE(1000, 10000)) rand
FROM DUAL
CONNECT BY LEVEL <= 10


DBMS_RANDOM.STRING
- 랜덤한 문자열을 생성한다
- Syntax : DBMS_RANDOM.STRING opt (IN CHAR, len IN NUMBER)
- opt(옵션)은 아래와 같다
'u', 'U' : 대문자
'l' , 'L'  : 소문자
'a', 'A' : 대소문자 구분없는 영문자
'x', 'X' : 영문자와 숫자 혼합
'p', 'P' : 문자 혼합

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- WITH문을 활용해서 옵션을 한 번에 조회해 보자
WITH t AS(
    SELECT DBMS_RANDOM.STRING('U',  10) rand FROM DUAL -- 대문자
    UNION ALL
    SELECT DBMS_RANDOM.STRING('L',  10) rand  FROM DUAL -- 소문자
    UNION ALL
    SELECT DBMS_RANDOM.STRING('A',  10) rand  FROM DUAL -- 영문자
    UNION ALL
    SELECT DBMS_RANDOM.STRING('X',  10) rand FROM DUAL -- 영숫자
    UNION ALL
    SELECT DBMS_RANDOM.STRING('P',  10) rand FROM DUAL  --문자혼합
)
SELECT * FROM t;
-- 아래와 같이 랜덤한 문자열이 조회되는 것을 확인 할 수 있다.
RAND
-----------
NSBJGKKQCL
iumlemfhtd
BGycevXKpp
JVM7L9COBI
7tdKU83j@{


성별, 날짜 생성

SELECT      LEVEL userId,
                MOD (ROWNUM, 50000) deptid
                TRUNC (DBMS_RANDOM.VALUE (1000, 500000), 2) salary,
                DECODE (ROUND (DBMS_RANDOM.VALUE (1, 2)),  1, 'M',  2, 'F') gender,
                TO_DATE (
                         ROUND (DBMS_RANDOM.VALUE (1, 28))
                      || '-'
                      || ROUND (DBMS_RANDOM.VALUE (1, 12))
                      || '-'
                      || ROUND (DBMS_RANDOM.VALUE (1900, 2010)),
                      'DD-MM-YYYY'
                 )
                dt,
FROM DUAL
CONNECT BY LEVEL < 10000;


이름 생성 함수
다음형식의 함수생성 GET_KORNM ('V_FROM', 'V_TO') VARCHAR2 으로리턴
BY OUT_REAL_NM 으로 리턴받고
BY V_ARR (VARCHAR2(10) 속성의 자료들이 기입되는 테이블)로 리턴 받고
V_FIRST V_ARR은 V_FIRST <- V_ARR인지 아니라면 무슨뜻인지?
CREATE OR REPLACE FUNCTION GET_KORNM 
    ( V_FROM IN VARCHAR2,
      V_TO   IN VARCHAR2 )
RETURN VARCHAR2 
IS
    OUT_REAL_NM VARCHAR2(100);
    TYPE V_ARR IS TABLE OF VARCHAR2(10);
    V_FIRST V_ARR;
    V_LAST V_ARR;
    V_MID V_ARR;
BEGIN 
    V_LAST := V_ARR('김' , '이' , '박' , '최' , '정'
                  , '강' , '조' , '윤' , '장' , '임' 
                  , '오' , '한' , '신' , '서' , '권' 
                  , '황' , '안' , '송' , '유' , '홍' 
                  , '전' , '고' , '문' , '손' , '양' 
                  , '배' , '조' , '백' , '허' , '남');
                  
    V_MID := V_ARR('민' , '현' , '동' , '인' , '지'
                 , '현' , '재' , '우' , '건' , '준' 
                 , '승' , '영' , '성' , '진' , '준' 
                 , '정' , '수' , '광' , '영' , '호' 
                 , '중' , '훈' , '후' , '우' , '상' 
                 , '연' , '철' , '아' , '윤' , '은');
                 
    V_FIRST := V_ARR('유' , '자' , '도' , '성' , '상' 
                   , '남' , '식' , '일' , '철' , '병' 
                   , '혜' , '영' , '미' , '환' , '식' 
                   , '숙' , '자' , '희' , '순' , '진' 
                   , '서' , '빈' , '정' , '지' , '하' 
                   , '연' , '성' , '공' , '안' , '원'); 
                   
SELECT SUBSTR(V_LAST(ROUND(DBMS_RANDOM.VALUE(1 , 30), 0)) ||
              V_MID(ROUND(DBMS_RANDOM.VALUE(1 , 30), 0)) ||
              V_FIRST(ROUND(DBMS_RANDOM.VALUE(1 , 30), 0)) ||
              V_MID(ROUND(DBMS_RANDOM.VALUE(1 , 30), 0)) ||
              V_FIRST(ROUND(DBMS_RANDOM.VALUE(1 , 30), 0)) 
             , V_FROM, V_TO)

    INTO OUT_REAL_NM 
    FROM DUAL; 
    
    RETURN OUT_REAL_NM; 
    
END;


인자값인 V_FROM 과 V_TO 는 외자 , 4자리 한글이름이 있듯이 GET_KORNM('1' , '2') , GET_KORNM('1' , '4') 처럼 사용한다.


SELECT GET_KORNM('1' , '3') FROM DUAL;
결과 : 송우순

REFERENCE:
http://www.gurubee.net/lecture/1400
http://rocabilly.tistory.com/275
http://cyh0214.tistory.com/entry/%EB%AC%B4%EC%9E%91%EC%9C%84-%ED%95%9C%EA%B8%80%EC%9D%B4%EB%A6%84-%EB%A7%8C%EB%93%A4%EA%B8%B0












댓글