1 取亂數
Oralce把所有有關亂數的操作都封裝在了PL/SQL包DBMS_RANDOM里,極大地方便了我們的使用,它具有以下函式:
其中,initialize,random,terminate函式在Oracle11g中已不推薦使用,主要用于向后兼容,下面對各個函式進行舉例說明,
1.1 INITIALIZE
用一個種子值來初始化DBMS_RANDOM包,
默認情況下,DBMS_RANDOM包是根據用戶、時間、會話來進行初始化,這樣,即便是同一個陳述句,每次生成的數值都會不一樣,但這樣會產生一個問題,在測驗環境下,如果我想每次生成的隨機序列都是一樣的,該怎么辦?INITIALIZE程序就很好的解決了這一問題,通過設定相同的種子值,則每次生成的隨機序列都將是一樣的,
語法:
DBMS_RANDOM.INITIALIZE (val IN BINARY_INTEGER);
舉例:
BEGIN DBMS_RANDOM.INITIALIZE(100); FOR I IN 1 .. 10 LOOP DBMS_OUTPUT.PUT_LINE(DBMS_RANDOM.RANDOM); END LOOP; END;View Code
--------------------------
163284779
751599369
659804475
1131809137
-865013504
-407075626
2128226600
-448154892
-1371178596
472933400
即便是在不同的會話中,不同的用戶下,隨機生成的10個值都是一樣的,
1.2 NORMAL
NORMAL函式回傳服從正態分布的一組數,此正態分布標準偏差為1,期望值為0,這個函式回傳的數值中有68%是介于-1與+1之間,95%介于-2與+2之間,99%介于-3與+3之間,
語法:
DBMS_RANDOM.NORMAL RETURN NUMBER;
舉例:
SELECT DBMS_RANDOM.NORMAL FROM DUAL;
--------------
0.321082787751054
1.3 RANDOM
回傳值的范圍為: [-2^31, 2^31),回傳的是整數,
語法:
DBMS_RANDOM.RANDOM RETURN binary_integer;
舉例:
SELECT DBMS_RANDOM.RANDOM FROM DUAL;
-------------
1632572475
SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;--獲取0-100內的隨機整數
--------------
51
1.4 SEED
功能和INITIALIZE程序類似,實際上,INITIALIZE程序被淘汰,推薦的替代程序即是SEED存盤程序,與INITIALIZE程序不同的是SEED程序同時支持數值和字符作為種子值,而INITIALIZE程序只支持數值,
語法:
DBMS_RANDOM.SEED (val IN BINARY_INTEGER); DBMS_RANDOM.SEED (val IN VARCHAR2);--VARCHAR2的最大范圍為2000
舉例:
BEGIN DBMS_RANDOM.SEED('hello'); FOR I IN 1 .. 10 LOOP DBMS_OUTPUT.PUT_LINE(DBMS_RANDOM.VALUE); END LOOP; END;View Code
-------------------
58
71
33
4
39
53
93
37
20
5
5. STRING
隨機生成字串,語法:
DBMS_RANDOM.STRING( opt IN CHAR,--字串的格式 len IN NUMBER--字串的長度 ) RETURN VARCHAR2;
--opt 字串的格式:
– 'u'或'U':大寫字母的字串
– 'l'或'L':小寫字母的字串
– 'a'或'A':不區分大小寫的任意字串
– 'x'或'X':任意大小寫字母或數字的字串
– 'p'或'P':任意可輸出字符的陣列
舉例:
SELECT DBMS_RANDOM.STRING('u', 10) VALUE FROM DUAL; -------------------- PSXFAKZZTR SELECT DBMS_RANDOM.STRING('l', 10) VALUE FROM DUAL; -------------------- elnircffly SELECT DBMS_RANDOM.STRING('a', 10) VALUE FROM DUAL; ------------------- vGuYnPoZNk SELECT DBMS_RANDOM.STRING('x', 10) VALUE FROM DUAL; -------------------- LH7Q36NLPR SELECT DBMS_RANDOM.STRING('p', 10) VALUE FROM DUAL; -------------------- IuX4B8lQ9pView Code
6. TERMINATE
在使用完DBMS_RANDOM包后,用該程序進行終止,該程序在11gR1中即不推薦使用了,
語法:
DBMS_RANDOM.TERMINATE;--For compatibility with 8.1
7. VALUE
此函式最為常用,其語法為:
DBMS_RANDOM.VALUE RETURN NUMBER;--[0,1),帶有38位精度的小數 DBMS_RANDOM.VALUE( low IN NUMBER,--最小值 high IN NUMBER--最大值 ) RETURN NUMBER;
舉例:
SELECT DBMS_RANDOM.VALUE FROM DUAL; ---------------------- 0.452943599091639 SELECT DBMS_RANDOM.VALUE(10, 20) FROM DUAL; ------------------------ 18.4659055244849
2 隨機取資料
Oracle隨機取資料的方法,一般有以下兩種:
2.1 快速隨機取資料
使用oracle的sample([sample_percent])或sample bloc(sample_percent)方法(采樣表掃描(sample table scan)),快速隨機取資料,推薦使用:
SELECT * FROM EBILL_ELECTRONIC_BILL SAMPLE(1) WHERE ROWNUM <= 10; --引數表示取樣百分比,預設時,取頭10條

類似的還有,sample_block:
SELECT * FROM EBILL_ELECTRONIC_BILL SAMPLE BLOCK(1) WHERE ROWNUM <= 10; --引數表資料存盤區間取樣百分比,必填

主要注意以下幾點:
1.sample_percent是一個數字,定義結果集中包含記錄占總記錄數量的百分比,值應該在[0.000001,99.999999]之間,
2.sample只對單表生效,不能用于表連接和遠程表
3.sample會使SQL自動使用CBO(基于代價的優化器)
2.2 隨機取資料
使用dbms_random.value隨機取資料,會全表掃描(Full table Scan),比較慢,不推薦使用:
SELECT * FROM (SELECT * FROM EBILL_ELECTRONIC_BILL ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 10

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/261701.html
標籤:Oracle
