標籤:
DBMS_RANDOM是Oracle提供的一個PL/SQL包,用於產生隨機資料和字元。它具有以下函數。
其中,initialize,random,terminate函數在Oracle11g中已不推薦使用,主要用於向後相容。下面對各個函數進行舉例說明
1. INITIALIZE
用一個種子值來初始化DBMS_RANDOM包。
預設情況下,DBMS_RANDOM包是根據使用者、時間、會話來進行初始化,這樣,即便是同一個語句,每次產生的數值都會不一樣,但這樣會產生一個問題,在測試環境下,如果我想每次產生的隨機序列都是一樣的,該怎麼辦?INITIALIZE函數就很好的解決了這一問題,通過設定相同的種子值,則每次產生的隨機序列都將是一樣的。
文法:
DBMS_RANDOM.INITIALIZE (
val IN BINARY_INTEGER);
舉例:
SQL> BEGIN 2 dbms_random.initialize(100); 3 FOR i IN 1 .. 10 LOOP 4 dbms_output.put_line(dbms_random.random); 5 END LOOP; 6 END; 7 /1632847797515993696598044751131809137-865013504-4070756262128226600-448154892-1371178596472933400PL/SQL procedure successfully completed.
即便是在不同的會話中,不同的使用者下,隨機產生的10個值都是一樣的。
2. NORMAL
NORMAL函數返回服從常態分佈的一組數。此常態分佈標準差為1,期望值為0。這個函數返回的數值中有68%是介於-1與+1之間,95%介於-2與+2之間,99%介於-3與+3之間。
文法:
DBMS_RANDOM.NORMAL
RETURN NUMBER;
舉例:
SQL> select dbms_random.normal from dual; NORMAL----------.321082788
3. RANDOM
RANDOM傳回值的範圍為: [-2^31, 2^31),返回的是整數。
文法:
DBMS_RANDOM.RANDOM
RETURN binary_integer;
舉例:
SQL> select dbms_random.random from dual; RANDOM-----------1.363E+09
4. SEED
功能和INITIALIZE函數類似,實際上,INITIALIZE函數被淘汰,推薦的替代函數即是SEED函數。與INITIALIZE函數不同的是SEED函數同時支援數值和字元作為種子值,而INITIALIZE函數只支援數值。
文法:
DBMS_RANDOM.SEED (
val IN BINARY_INTEGER);
DBMS_RANDOM.SEED (
val IN VARCHAR2);
舉例:
BEGIN dbms_random.seed(‘hello‘); FOR i IN 1 .. 10 LOOP dbms_output.put_line(round(dbms_random.value * 100)); END LOOP;END;
輸出如下:
587133439539337205
其中,VARCHAR2的最大範圍為2000.
5. STRING
隨機產生字串
文法:
DBMS_RANDOM.STRING
opt IN CHAR,
len IN NUMBER)
RETURN VARCHAR2;
關於opt和len的說明,解釋如下:
可見,opt指的是字串的格式,len指的是字串的長度。
舉例:
SQL> select dbms_random.string(‘u‘,10) value from dual;VALUE--------------------MCPEZLEQOOSQL> select dbms_random.string(‘l‘,10) value from dual;VALUE--------------------laufaquflnSQL> select dbms_random.string(‘a‘,10) value from dual;VALUE--------------------vjEetXlIttSQL> select dbms_random.string(‘x‘,10) value from dual;VALUE--------------------LAMDGZE22ESQL> select dbms_random.string(‘p‘,10) value from dual;VALUE--------------------4LF =Q‘(fP
6. TERMINATE
在使用完DBMS_RANDOM包後,用該函數進行終止。該函數在11gR1中即不推薦使用了。
文法:
DBMS_RANDOM.TERMINATE;
舉例:
SQL> exec DBMS_RANDOM.TERMINATE;PL/SQL procedure successfully completed.
7. VALUE
文法:
DBMS_RANDOM.VALUE
RETURN NUMBER;
DBMS_RANDOM.VALUE(
low IN NUMBER,
high IN NUMBER)
RETURN NUMBER;
對於第一種用法,返回的值的範圍為大於或等於0,小於1,帶有38位精度的小數。
對於第二種用法,可指定最小值和最大值,傳回值的範圍為大於或等於low,小於high。
舉例:
SQL> select dbms_random.value from dual; VALUE----------.291782963SQL> select dbms_random.value(10,20) from dual;DBMS_RANDOM.VALUE(10,20)------------------------ 12.4079412
總結:
關於VALUE函數返回38位精度的小數,可通過以下方式驗證。
SQL> select dbms_random.value from dual; VALUE----------.511020102SQL> col value for 999999.9999999999999999999999999999999999999999999999999SQL> select dbms_random.value from dual; VALUE--------------------------------------------------------- .1590863051775181450023750363985770254400000000000SQL> / VALUE--------------------------------------------------------- .5831363280913832608492096535119024112700000000000
故意將value列的格式設定為999999.9999999999999999999999999999999999999999999999999,當然不限,只要小數位元超過38位即可,在本例中,為49位,通過dbms_random.value隨機返回數值,不難發現,最後產生的數值雖然是49位,但最後11位均是0,換句話說,有效數值只有38位。
參考:
1. http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_random.htm#ARPLS040
2. http://zhangzhongjie.iteye.com/blog/1948930
Oracle之DBMS_RANDOM包詳解