【Oracle學習筆記】Oralce隨機數與隨機取樣

1 取隨機數

Oralce把全部有關隨機數的操做都封裝在了PL/SQLDBMS_RANDOM裏,極大地方便了咱們的使用。它具備如下函數數組

 

其中,initialize,random,terminate函數在Oracle11g中已不推薦使用,主要用於向後兼容。下面對各個函數進行舉例說明oracle

1.1 INITIALIZE

用一個種子值來初始化DBMS_RANDOM包。dom

默認狀況下,DBMS_RANDOM包是根據用戶、時間、會話來進行初始化,這樣,即使是同一個語句,每次生成的數值都會不同,但這樣會產生一個問題,在測試環境下,若是我想每次生成的隨機序列都是同樣的,該怎麼辦?INITIALIZE過程就很好的解決了這一問題,經過設置相同的種子值,則每次生成的隨機序列都將是同樣的。ide

語法:函數

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

--------------------------優化

163284779spa

7515993693d

659804475code

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;
--------------------
IuX4B8lQ9p
View 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 快速隨機取數據

使用oraclesample([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

 

相關文章
相關標籤/搜索