1 取隨機數(shù)Oralce把所有有關隨機數(shù)的操作都封裝在了PL/SQL包DBMS_RANDOM里,極大地方便了我們的使用。它具有以下函數(shù):
其中,initialize,random,terminate函數(shù)在Oracle11g中已不推薦使用,主要用于向后兼容。下面對各個函數(shù)進行舉例說明。 1.1 INITIALIZE用一個種子值來初始化DBMS_RANDOM包。 默認情況下,DBMS_RANDOM包是根據(jù)用戶、時間、會話來進行初始化,這樣,即便是同一個語句,每次生成的數(shù)值都會不一樣,但這樣會產(chǎn)生一個問題,在測試環(huán)境下,如果我想每次生成的隨機序列都是一樣的,該怎么辦?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; -------------------------- 163284779 751599369 659804475 1131809137 -865013504 -407075626 2128226600 -448154892 -1371178596 472933400 即便是在不同的會話中,不同的用戶下,隨機生成的10個值都是一樣的。 1.2 NORMALNORMAL函數(shù)返回服從正態(tài)分布的一組數(shù)。此正態(tài)分布標準偏差為1,期望值為0。這個函數(shù)返回的數(shù)值中有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),返回的是整數(shù)。 語法: DBMS_RANDOM.RANDOM RETURN binary_integer;
舉例: SELECT DBMS_RANDOM.RANDOM FROM DUAL; ------------- 1632572475
SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;--獲取0-100內(nèi)的隨機整數(shù) -------------- 51 1.4 SEED功能和INITIALIZE過程類似,實際上,INITIALIZE過程被淘汰,推薦的替代過程即是SEED存儲過程,與INITIALIZE過程不同的是SEED過程同時支持數(shù)值和字符作為種子值,而INITIALIZE過程只支持數(shù)值。 語法: 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; ------------------- 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':不區(qū)分大小寫的任意字符串 – 'x'或'X':任意大小寫字母或數(shù)字的字符串 – 'p'或'P':任意可輸出字符的數(shù)組 舉例: ![]() 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; -------------------- IuX4B8lQ9p 6. TERMINATE在使用完DBMS_RANDOM包后,用該過程進行終止。該過程在11gR1中即不推薦使用了。 語法: DBMS_RANDOM.TERMINATE;--For compatibility with 8.1 7. VALUE此函數(shù)最為常用,其語法為: DBMS_RANDOM.VALUE RETURN NUMBER;--[0,1),帶有38位精度的小數(shù) 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 隨機取數(shù)據(jù)Oracle隨機取數(shù)據(jù)的方法,一般有以下兩種: 2.1 快速隨機取數(shù)據(jù)使用oracle的sample([sample_percent])或sample bloc(sample_percent)方法(采樣表掃描(sample table scan)),快速隨機取數(shù)據(jù),推薦使用: SELECT * FROM EBILL_ELECTRONIC_BILL SAMPLE(1) WHERE ROWNUM <= 10; --參數(shù)表示取樣百分比,缺省時,取頭10條 類似的還有,sample_block: SELECT * FROM EBILL_ELECTRONIC_BILL SAMPLE BLOCK(1) WHERE ROWNUM <= 10; --參數(shù)表數(shù)據(jù)存儲區(qū)間取樣百分比,必填 主要注意以下幾點: 1.sample_percent是一個數(shù)字,定義結(jié)果集中包含記錄占總記錄數(shù)量的百分比,值應該在[0.000001,99.999999]之間。 2.sample只對單表生效,不能用于表連接和遠程表 3.sample會使SQL自動使用CBO(基于代價的優(yōu)化器) 2.2 隨機取數(shù)據(jù)使用dbms_random.value隨機取數(shù)據(jù),會全表掃描(Full table Scan),比較慢,不推薦使用: SELECT * FROM (SELECT * FROM EBILL_ELECTRONIC_BILL ORDER BY DBMS_RANDOM.VALUE) WHERE ROWNUM <= 10
|
|
來自: python_lover > 《待分類》