데이터노트/오라클이야기

Oracle의 DBMS_RANDOM 패키지 활용 방법

다양한 이유로 프로그램을 작성할 때, RANDOM 데이터가 필요한 상황이 발생합니다. 이를 효과적으로 처리할 수 있도록, 일반적인 프로그래밍 언어에서는 RANDOM 데이터를 효과적으로 생성하는 방법을 제공하고 있습니다. 데이터베이스를 관리하는 DBMS에서도 이런 RANDOM 데이터를 생성하는 도구를 제공하고 있으며, Oracle RDBMS는 버전 8 이상부터 DBMS_RANDOM Package를 활용해 RANDOM 데이터를 생성할 수 있습니다. 


이 글에서는 Oracle DBMS_RANDOM Package에 대해 간단히 알아보고, Oracle RDBMS에서 RANDOM 데이터를 생성하는 다양한 방법을 소개하겠습니다. 마지막으로 간단한 퀴즈를 통해, 실제 활용하는 예제를 살펴보겠습니다.


About Oracle DBMS_RANDOM Package

Oracle RDBMS의 DBMS_RANDOM Package는 임의의 숫자나 문자, 또는 숫자와 문자의 조합 등을 생성할 수 있습니다. 이 기능은 다양한 곳에 응용하여 활용할 수 있습니다. 가장 대표적인 예로 임의의 데이터를 생성하여 비밀번호로 활용[각주:1]하거나 특정 범위 안에 속하는 데이터를 생성하여 테스트 데이터 등으로 활용할 수 있습니다.


Summary of DBMS_RANDOM Subprograms
Subprogram Description
INITIALIZE Procedure 패키지를 초기화합니다.
NORMAL Function 정규 분포의 임의의 수를 반환합니다.
RANDOM Procedure 임의의 수를 생성합니다.
SEED Procedure Seed 값을 재설정합니다.
STRING Function 임의의 문자를 생성합니다.
TERMINATE Procedure 종료 패키지입니다.
VALUE Functions 임의의 수를 생성합니다.
0~1 사이의 숫자를 생성하며, 소수점 38자리 정밀도를 가지는 임의의 수를 생성합니다.


INITIALIZE Procedure

이 프로시저는 생성자를 초기화합니다. 이 프로시저는 현재 정상적으로 동작하지만, 공식적으로 Oracle RDBMS 11gR1부터 지원이 종료되었습니다. 그러므로 앞으로는 사용하지 못할 수도 있습니다. 


이 프로시저는 간단히 SEED Procedure를 호출하는 것으로 대체할 수 있습니다.


NORMAL Function

이 함수는 표준 정규 분포[각주:2] 범위의 임의의 숫자를 반환합니다.

SELECT DBMS_RAMDOM.NORMAL FROM DUAL;


RANDOM Procedure

이 프로시저는 임의의 수를 생성합니다. 이 프로시저의 반환 값은 -231 ~ 231입니다. 이 프로시저는 현재 정상적으로 동작하지만, 공식적으로 Oracle RDBMS 11gR1부터 지원이 종료되었습니다. 그러므로 앞으로는 사용하지 못할 수도 있습니다.

SELECT DBMS_RANDOM.RANDOM FROM DUAL;


SEED Procedure

이 프로시저는 시드(SEED) 값을 리셋합니다. 이 예제는 다음 링크의 글을 참조했습니다.

SET SERVEROUTPUT ON BEGIN DBMS_OUTPUT.put_line('Run 1 : seed=0'); DBMS_RANDOM.seed (val => 0); FOR i IN 1 ..5 LOOP DBMS_OUTPUT.put_line('i=' || i || ' : value=' || DBMS_RANDOM.value(low => 1, high => 10)); END LOOP; DBMS_OUTPUT.put_line('Run 2 : seed=0'); DBMS_RANDOM.seed (val => 0); FOR i IN 1 ..5 LOOP DBMS_OUTPUT.put_line('i=' || i || ' : value=' || DBMS_RANDOM.value(low => 1, high => 10)); END LOOP; END; /


STRING Function

이 함수는 임의의 문자를 생성합니다. 이 함수는 두 개의 매개변수를 가지는데, 첫 번째 매개변수는 Option 값을 의미하고, 두 번째 매개변수는 반환될 문자열의 길이를 의미합니다. 


이 함수에서 사용할 수 있는 옵션 값은 다음과 같으며, 대소문자를 구분하지 않습니다. 이 옵션 값 이외의 문자를 입력하면, 대문자로 구성된 알파벳 문자열을 반환합니다. 이 옵션에서 아쉬운 점은 대/소문자로 혼합된 알파벳과 숫자 등의 조합으로 구성된 문자열을 생성하지 못하는 것입니다. 개인적으로는 빈번히 활용하는 옵션으로 생각하는데, 제공하지 않아 아쉽습니다.


  • 'U' - 대문자로 구성된 알파벳 문자열을 반환
  • 'L' - 소문자로 구성된 알파벳 문자열을 반환
  • 'A' - 대/소문자 혼합된 알파벳 문자열을 반환
  • 'X' - 알파벳 대문자와 숫자가 혼합된 문자열을 반환
  • 'P' - 인쇄 가능한 문자로 구성된 문자열을 반환


대문자 20자리 임의의 문자열을 생성하는 질의 예제입니다.

SELECT DBMS_RANDOM.STRING('U', 20) FROM DUAL;


소문자 20자리 임의의 문자열을 생성하는 질의 예제입니다.

SELECT DBMS_RANDOM.STRING('L', 20) FROM DUAL;


대소문자가 혼합된 20자리 임의의 문자열을 생성하는 질의 예제입니다.

SELECT DBMS_RANDOM.STRING('A', 20) FROM DUAL;


대문자와 숫자가 혼합된 20자리 임의의 문자열을 생성하는 질의 예제입니다.

SELECT DBMS_RANDOM.STRING('X', 20) FROM DUAL;


인쇄 가능한 문자가 혼합된 20자리 임의의 문자열을 생성하는 질의 예제입니다.

SELECT DBMS_RANDOM.STRING('P', 20) FROM DUAL;


TERMINATE Procedure

DBMS_RANDOM Package를 종료할 때, 이 프로시저를 호출합니다. 이 프로시저는 현재 정상적으로 동작하지만, 공식적으로 Oracle RDBMS 11gR1부터 지원이 종료되었습니다. 그러므로 앞으로는 사용하지 못할 수도 있습니다.


VALUE Functions

이 기본 함수는 0~1 사이의 임의의 숫자를 생성합니다. 이때, 생성한 숫자는 소수점 38자리 정밀도를 가집니다. 이 함수는 두 가지 구문 형식을 가지며, 예제를 통해 살펴보겠습니다.


일반적으로 활용하는 질의 예제입니다. 0~1 사이의 임의의 숫자를 생성합니다.

SELECT DBMS_RANDOM.VALUE FROM DUAL;


다음은 생성하는 숫자의 범위를 지정하는 예제입니다. 1~100 사이의 임의의 숫자를 생성합니다.

SELECT DBMS_RANDOM.VALUE(1, 100) FROM DUAL;


지금까지 Oracle RDBMS에서 제공하는 DBMS_RANDOM Package에 대해 간단하게 살펴봤습니다. Oracle DBMS_RANDOM Package에 대해 더 자세한 사항은 Oracle Document를 참조하시기 바랍니다.


Quiz Ⅰ

[문제] 대소문자와 숫자가 결합된 20자리 임의의 문자열을 생성하시오.



Quiz Ⅱ

[문제] 다음 요구사항을 만족하는 데이터를 생성하시오.


요구사항은 다음과 같습니다. 먼저 A1~A10 지역(REG)이 있습니다. 각 지역별로 최대 5개의 센서가 있으며, 센서 목록은 CO2(S01), 온도(S02), 습도(S03), 소음(S04), 조도(S05)입니다. 단, 조도 센서는 A01~A05 지역에만 있습니다. 


센서별 생성 값의 범위는 다음과 같습니다. S01 센서는 450~2,000PPM이며, S02 센서는 20~34도, S03 센서는 27~61%, S04 센서는 300~1500Lx, 마지막으로 S05 센서는 38~55dB입니다. 생성할 데이터는 2014년 09월 01일부터 2014년 09월 30일까지의 데이터이며, 시간 당 수집되는 센서 데이터는 각 센서별로 약 30회 수집합니다.



Conclusion

지금까지 Oracle RDBMS에서 제공하는 DBMS_RANDOM Package에 대해 간단하게 살펴봤습니다. 기존 프로그래밍 언어가 아닌 RDBMS에서도 RANDOM 데이터를 생성할 수 있어 상당히 유용하게 활용할 수 있습니다. Quiz Ⅱ에서 살펴본 것처럼 가상의 데이터를 데이터베이스에서 쉽게 생성할 수 있어 간단한 테스트를 진행할 때, 편리하게 활용할 수 있습니다.


References

Oracle, Oracle Document, Oracle [관련링크]

Oracle-Base, DBMS_RANDOM : Generating Random Numbers and Strings in Oracle, Oracle [관련링크]

  1. DBMS_RANDOM Package는 암호화하기 위한 것이 아닙니다. [본문으로]
  2. 평균이 0이고, 표준편차가 1인 정규 분포. [본문으로]