Oracle生成隨機數字、字符串、日期、驗證碼及 UUID的方法
在日常生活中,隨機數對於我們而言並不陌生,例如手機短信驗證碼就是一個隨機的數字字符串;對於統計分析、機器學習等領域而言,通常也需要生成大量的隨機數據用於測試、數據抽樣、算法驗證等。那麼今天我們就來談談如何在 Oracle 數據庫中生成隨機數據。
📝計算機生成的都是偽隨機數,並不是真正的物理隨機數。
生成隨機數字
Oracle 提供瞭一個系統程序包 DBMS_RANDOM,可以用於生成隨機數據,例如隨機數字、隨機字符串等。
生成 0 到 1 之間的隨機數
DBMS_RANDOM.VALUE 函數可以用於生成一個大於等於 0 小於 1 的隨機數字。例如:
SELECT dbms_random.value FROM dual; VALUE | ----------------------------------------| 0.82366672879802619203358096665727275462| SELECT dbms_random.value FROM dual; VALUE | ----------------------------------------| 0.47093028485681981896753470853250955607|
DBMS_RANDOM.VALUE 函數返回的數據包含 38 位小數,每次返回不同的數據。
有時候,例如測試時,我們想要確保每次運行時生成相同的隨機數。這種情況下,我們可以使用存儲過程 DBMS_RANDOM.SEED 設置一個隨機數種子,然後再創建隨機數就可以返回固定的數值。例如:
CALL dbms_random.seed(1); SELECT dbms_random.value FROM dual; VALUE | ----------------------------------------| 0.75096444209816859425547820733985992585| CALL dbms_random.seed(1); SELECT dbms_random.value FROM dual; VALUE | ----------------------------------------| 0.75096444209816859425547820733985992585|
從結果可以看出,相同的種子返回瞭相同的隨機數。每次運行隨機數函數之前,都需要執行一次 DBMS_RANDOM.SEED 過程。
📝除瞭整數類型的種子數之外,也可以使用字符串作為隨機數的種子。
生成指定范圍內的隨機數
DBMS_RANDOM.VALUE 函數也可以接收兩個輸入參數:
DBMS_RANDOM.VALUE( low IN NUMBER, high IN NUMBER) RETURN NUMBER;
這種形式的函數將會返回一個大於等於 low,小於 high 的隨機數。例如:
CALL dbms_random.seed(1); SELECT dbms_random.value(10, 20) FROM dual; DBMS_RANDOM.VALUE(10,20) | ----------------------------------------| 17.5096444209816859425547820733985992585|
以上示例返回瞭一個大於等於 10,小於 20 的數字。
如果想要生成某個范圍內的隨機整數,可以利用 DBMS_RANDOM.VALUE 加上 TRUNC 函數實現。例如:
CALL dbms_random.seed(1); SELECT trunc(dbms_random.value(10, 20)) v FROM dual; V | --| 17|
註意,以上語句返回的是大於等於 10,小於等於 19(不是 20)的整數。
生成 6 位數字手機驗證碼
以下語句可以用於生成一個由 6 位數字字符組成的驗證碼:
CALL dbms_random.seed(0); SELECT lpad(trunc(dbms_random.value(0, 1000000)),6,'0') captcha FROM dual; CAPTCHA| -------| 063365 |
lpad 函數可以確保數據不夠 6 位時在前面補足 0。
生成標準正態分佈隨機數
DBMS_RANDOM.VALUE 函數生成的是一個均勻分佈的隨機數,而 DBMS_RANDOM.NORMAL 函數可以用於返回一個遵循標準正態分佈(期望值為 0,標準差為 1)的隨機數。例如:
CALL dbms_random.seed(1); SELECT dbms_random.normal FROM dual; NORMAL | ------------------------------------------| 0.4116858715102697161411270380245532257962|
生成隨機字符串
生成固定長度的隨機字符串
除瞭隨機數字之外,DBMS_RANDOM.STRING 函數可以用於產生一個隨機字符串:
DBMS_RANDOM.STRING opt IN CHAR, len IN NUMBER) RETURN VARCHAR2;
其中,參數 opt 可以指定返回字符串的類型:
- ‘u’, ‘U’,返回由大寫字母組成的字符串;
- ‘l’, ‘L’,返回由小寫字母組成的字符串;
- ‘a’, ‘A’,返回由大小寫混合字母組成的字符串;
- ‘x’, ‘X’,返回由大寫字母和數字組成的字符串;
- ‘p’, ‘P’,返回由任意可打印字符組成的字符串;
- 其他參數,返回由大寫字母組成的字符串。
參數 len 表示返回字符串的長度。例如:
CALL dbms_random.seed(1); SELECT dbms_random.string('p', 10) FROM dual; DBMS_RANDOM.STRING('P',10)| --------------------------| gqB!U5t^a6 |
以上示例返回瞭一個長度為 10,由任意可打印字符組成的隨機字符串。
生成可變長度的隨機字符串
那麼,怎麼返回一個長度可變的隨機字符串呢?很簡單,將 DBMS_RANDOM.STRING 和 DBMS_RANDOM.VALUE 函數結合一下就可以瞭。例如:
CALL dbms_random.seed(1); SELECT dbms_random.string('p', trunc(dbms_random.value(10,21))) AS random_string FROM dual; RANDOM_STRING | ------------------| qB!U5t^a6ZFUoIw|O^|
以上示例返回瞭一個隨機長度大於等於 10 且小於等於 20,由任意可打印字符組成的隨機字符串。
生成隨機日期
將指定日期或者時間戳增加一個隨機的數字,就可以得到隨機的日期和時間戳。例如:
CALL dbms_random.seed(1); SELECT trunc(date '2020-01-01'+dbms_random.value(0,31)) rand_date, timestamp '2020-01-01 00:00:00'+dbms_random.value(0,31) rand_ts FROM dual; RAND_DATE |RAND_TS | -------------------|-------------------| 2020-01-24 00:00:00|2020-01-27 16:07:37|
以上示例返回瞭 2020 年 1 月中的某個隨機日期和時間戳。
獲取隨機記錄
對於查詢語句,如果返回多行數據,DBMS_RANDOM 程序包中的函數會返回不同的隨機數據。例如:
CALL dbms_random.seed(1); SELECT dbms_random.value FROM employee; VALUE | ----------------------------------------| 0.75096444209816859425547820733985992585| 0.86038577935739084599473227591041135085| 0.36531856164744564910966598428812048036| ...
利用這個特性,我們可以從表中返回隨機的數據行。例如:
CALL dbms_random.seed(1); SELECT emp_id, emp_name FROM employee ORDER BY dbms_random.value FETCH FIRST 5 ROWS ONLY; EMP_ID|EMP_NAME | ------|---------| 10|廖化 | 24|簡雍 | 20|蔣琬 | 6|魏延 | 4|諸葛亮 |
以上示例從 employee 表中返回瞭隨機的 5 行數據。
另外,Oracle 還提供瞭一個 SAMPLE 子句,可以用於返回按照百分比指定的隨機抽樣數據。例如:
SELECT emp_id, emp_name FROM employee sample (10) seed(1); EMP_ID|EMP_NAME | ------|---------| 4|諸葛亮 | 5|黃忠 | 16|周倉 |
以上示例返回瞭 employee 表中抽樣 10% 的隨機數據(employee 表共計有 25 條數據),seed 用於設置隨機抽樣的種子。
⚠️SAMPLE 子句是一種基於數據庫統計信息的預估,如果統計數據不準確,查詢結果可能會存在較大偏差。
生成 UUID
UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一個 128 比特的數字,可以用於唯一標識每個網絡對象或資源。由於它的生成機制,一個 UUID 可以保證幾乎不會與其他 UUID 重復,因此常常用於生成數據庫中的主鍵值。
Oracle 提供瞭一個系統函數 SYS_GUID(),可以用於生成 GUID。例如:
SELECT rawtohex(sys_guid()) FROM dual; RAWTOHEX(SYS_GUID()) | --------------------------------| ACCDB38D17FA1103E05579D90B3808D7|
如果想要生成帶中劃線(-)的 UUID,可以創建以下自定義函數:
CREATE OR REPLACE FUNCTION new_guid RETURN varchar2 AS lv_guid varchar(32); BEGIN lv_guid:=rawtohex(sys_guid()); RETURN substr(lv_guid,1,8) || '-' ||substr(lv_guid,9,4) || '-' ||substr(lv_guid,13,4)|| '-' ||substr(lv_guid,17,4)|| '-' ||substr(lv_guid,21,12); END; /
new_guid 函數隻是基於系統函數 sys_guid 返回的結果增加瞭 4 個中劃線。試用一下:
SELECT new_guid() FROM dual; NEW_GUID() | ------------------------------------| ACCDB38D-17FD-1103-E055-79D90B3808D7|
總結
本文總結瞭在 Oracle 數據庫中使用系統程序包 DBMS_RANDOM 生成隨機數據的方法,包括隨機數字、驗證碼、隨機字符串以及隨機日期和時間等,同時還介紹瞭如何從表中返回隨機記錄,以及如何生成 UUID。
到此這篇關於Oracle生成隨機數字、字符串、日期、驗證碼及 UUID的方法的文章就介紹到這瞭,更多相關Oracle生成隨機數UUID內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- orcale中的to_number方法使用
- 使用 SQL 語句實現一個年會抽獎程序的代碼
- oracle索引的測試實例代碼
- MySQL 生成隨機數字、字符串、日期、驗證碼及 UUID的方法
- Oracle根據時間查詢的一些常見情況匯總