佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Oracle生成隨機數(shù)字、字符串、日期、驗證碼及 UUID的方法

Oracle生成隨機數(shù)字、字符串、日期、驗證碼及 UUID的方法

熱門標簽:鐵路電話系統(tǒng) 呼叫中心市場需求 網(wǎng)站排名優(yōu)化 服務外包 百度競價排名 Linux服務器 地方門戶網(wǎng)站 AI電銷

在日常生活中,隨機數(shù)對于我們而言并不陌生,例如手機短信驗證碼就是一個隨機的數(shù)字字符串;對于統(tǒng)計分析、機器學習等領域而言,通常也需要生成大量的隨機數(shù)據(jù)用于測試、數(shù)據(jù)抽樣、算法驗證等。那么今天我們就來談談如何在 Oracle 數(shù)據(jù)庫中生成隨機數(shù)據(jù)。

📝計算機生成的都是偽隨機數(shù),并不是真正的物理隨機數(shù)。

生成隨機數(shù)字

Oracle 提供了一個系統(tǒng)程序包 DBMS_RANDOM,可以用于生成隨機數(shù)據(jù),例如隨機數(shù)字、隨機字符串等。

生成 0 到 1 之間的隨機數(shù)

DBMS_RANDOM.VALUE 函數(shù)可以用于生成一個大于等于 0 小于 1 的隨機數(shù)字。例如:

SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.82366672879802619203358096665727275462|

SELECT dbms_random.value FROM dual;
VALUE     |
----------------------------------------|
0.47093028485681981896753470853250955607|

DBMS_RANDOM.VALUE 函數(shù)返回的數(shù)據(jù)包含 38 位小數(shù),每次返回不同的數(shù)據(jù)。

有時候,例如測試時,我們想要確保每次運行時生成相同的隨機數(shù)。這種情況下,我們可以使用存儲過程 DBMS_RANDOM.SEED 設置一個隨機數(shù)種子,然后再創(chuàng)建隨機數(shù)就可以返回固定的數(shù)值。例如:

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|

從結果可以看出,相同的種子返回了相同的隨機數(shù)。每次運行隨機數(shù)函數(shù)之前,都需要執(zhí)行一次 DBMS_RANDOM.SEED 過程。

📝除了整數(shù)類型的種子數(shù)之外,也可以使用字符串作為隨機數(shù)的種子。

生成指定范圍內(nèi)的隨機數(shù)

DBMS_RANDOM.VALUE 函數(shù)也可以接收兩個輸入?yún)?shù):

DBMS_RANDOM.VALUE(
 low IN NUMBER,
 high IN NUMBER)
RETURN NUMBER;

這種形式的函數(shù)將會返回一個大于等于 low,小于 high 的隨機數(shù)。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.value(10, 20) FROM dual;
DBMS_RANDOM.VALUE(10,20)  |
----------------------------------------|
17.5096444209816859425547820733985992585|

以上示例返回了一個大于等于 10,小于 20 的數(shù)字。

如果想要生成某個范圍內(nèi)的隨機整數(shù),可以利用 DBMS_RANDOM.VALUE 加上 TRUNC 函數(shù)實現(xiàn)。例如:

CALL dbms_random.seed(1);
SELECT trunc(dbms_random.value(10, 20)) v FROM dual;
V |
--|
17|

 

注意,以上語句返回的是大于等于 10,小于等于 19(不是 20)的整數(shù)。

生成 6 位數(shù)字手機驗證碼

以下語句可以用于生成一個由 6 位數(shù)字字符組成的驗證碼:

CALL dbms_random.seed(0);
SELECT lpad(trunc(dbms_random.value(0, 1000000)),6,'0') captcha FROM dual;
CAPTCHA|
-------|
063365 |

lpad 函數(shù)可以確保數(shù)據(jù)不夠 6 位時在前面補足 0。

生成標準正態(tài)分布隨機數(shù)

DBMS_RANDOM.VALUE 函數(shù)生成的是一個均勻分布的隨機數(shù),而 DBMS_RANDOM.NORMAL 函數(shù)可以用于返回一個遵循標準正態(tài)分布(期望值為 0,標準差為 1)的隨機數(shù)。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.normal FROM dual;
NORMAL     |
------------------------------------------|
0.4116858715102697161411270380245532257962|

生成隨機字符串

生成固定長度的隨機字符串

除了隨機數(shù)字之外,DBMS_RANDOM.STRING 函數(shù)可以用于產(chǎn)生一個隨機字符串:

DBMS_RANDOM.STRING
 opt IN CHAR,
 len IN NUMBER)
 RETURN VARCHAR2;

其中,參數(shù) opt 可以指定返回字符串的類型:

  • ‘u', ‘U',返回由大寫字母組成的字符串;
  • ‘l', ‘L',返回由小寫字母組成的字符串;
  • ‘a(chǎn)', ‘A',返回由大小寫混合字母組成的字符串;
  • ‘x', ‘X',返回由大寫字母和數(shù)字組成的字符串;
  • ‘p', ‘P',返回由任意可打印字符組成的字符串;
  • 其他參數(shù),返回由大寫字母組成的字符串。

參數(shù) 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 函數(shù)結合一下就可以了。例如:

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,由任意可打印字符組成的隨機字符串。

生成隨機日期

將指定日期或者時間戳增加一個隨機的數(shù)字,就可以得到隨機的日期和時間戳。例如:

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 月中的某個隨機日期和時間戳。

獲取隨機記錄

對于查詢語句,如果返回多行數(shù)據(jù),DBMS_RANDOM 程序包中的函數(shù)會返回不同的隨機數(shù)據(jù)。例如:

CALL dbms_random.seed(1);
SELECT dbms_random.value FROM employee;
VALUE     |
----------------------------------------|
0.75096444209816859425547820733985992585|
0.86038577935739084599473227591041135085|
0.36531856164744564910966598428812048036|
...

利用這個特性,我們可以從表中返回隨機的數(shù)據(jù)行。例如:

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 行數(shù)據(jù)。

另外,Oracle 還提供了一個 SAMPLE 子句,可以用于返回按照百分比指定的隨機抽樣數(shù)據(jù)。例如:

SELECT emp_id, emp_name
FROM employee sample (10) seed(1);
EMP_ID|EMP_NAME |
------|---------|
 4|諸葛亮 |
 5|黃忠 |
 16|周倉 |

以上示例返回了 employee 表中抽樣 10% 的隨機數(shù)據(jù)(employee 表共計有 25 條數(shù)據(jù)),seed 用于設置隨機抽樣的種子。

⚠️SAMPLE 子句是一種基于數(shù)據(jù)庫統(tǒng)計信息的預估,如果統(tǒng)計數(shù)據(jù)不準確,查詢結果可能會存在較大偏差。

生成 UUID

UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一個 128 比特的數(shù)字,可以用于唯一標識每個網(wǎng)絡對象或資源。由于它的生成機制,一個 UUID 可以保證幾乎不會與其他 UUID 重復,因此常常用于生成數(shù)據(jù)庫中的主鍵值。

Oracle 提供了一個系統(tǒng)函數(shù) SYS_GUID(),可以用于生成 GUID。例如:

SELECT rawtohex(sys_guid()) FROM dual;
RAWTOHEX(SYS_GUID())  |
--------------------------------|
ACCDB38D17FA1103E05579D90B3808D7|

如果想要生成帶中劃線(-)的 UUID,可以創(chuàng)建以下自定義函數(shù):

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 函數(shù)只是基于系統(tǒng)函數(shù) sys_guid 返回的結果增加了 4 個中劃線。試用一下:

SELECT new_guid() FROM dual;
NEW_GUID()    |
------------------------------------|
ACCDB38D-17FD-1103-E055-79D90B3808D7|

總結

本文總結了在 Oracle 數(shù)據(jù)庫中使用系統(tǒng)程序包 DBMS_RANDOM 生成隨機數(shù)據(jù)的方法,包括隨機數(shù)字、驗證碼、隨機字符串以及隨機日期和時間等,同時還介紹了如何從表中返回隨機記錄,以及如何生成 UUID。

到此這篇關于Oracle生成隨機數(shù)字、字符串、日期、驗證碼及 UUID的方法的文章就介紹到這了,更多相關Oracle生成隨機數(shù)UUID內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • mysql生成指定位數(shù)的隨機數(shù)及批量生成隨機數(shù)的方法
  • MySQL的指定范圍隨機數(shù)函數(shù)rand()的使用技巧
  • mysql 某字段插入隨機數(shù)(插入隨機數(shù)到MySQL數(shù)據(jù)庫)
  • MySQL查詢隨機數(shù)據(jù)的4種方法和性能對比
  • MySQL 生成隨機數(shù)字、字符串、日期、驗證碼及 UUID的方法

標簽:蘭州 銅川 湘潭 崇左 黃山 仙桃 湖南 衡水

巨人網(wǎng)絡通訊聲明:本文標題《Oracle生成隨機數(shù)字、字符串、日期、驗證碼及 UUID的方法》,本文關鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    通江县| 天祝| 麟游县| 洞头县| 沂源县| 龙游县| 南汇区| 安达市| 盐亭县| 铜梁县| 洛宁县| 东辽县| 称多县| 类乌齐县| 北海市| 商丘市| 方正县| 崇文区| 高陵县| 宜兴市| 新邵县| 香河县| 织金县| 怀仁县| 乌鲁木齐县| 六枝特区| 红安县| 新乐市| 明水县| 南雄市| 出国| 奇台县| 新巴尔虎右旗| 华安县| 壤塘县| 唐海县| 棋牌| 洛川县| 大田县| 台中县| 铜鼓县|