講解Oracle裡抽取隨機數的多種方法

2021-05-22 01:58:25 字數 1686 閱讀 4296

在你的工作中是否會為了某個活動要隨機取出一些符合條件的email或者手機號碼使用者,來頒發獲獎通知或其它訊息?本文以例項的方式來講解如何抽取隨機數的多種方法。

假如是的話,可以用oracle裡生成隨機數的pl/sql,

目錄檔名在:/oracle_home/rdbms/admin/dbmsrand.sql。

用之前先要在sys使用者下編譯:sql>@/oracle_home/rdbms/admin/dbmsrand.sql。

它實際是在sys使用者下生成乙個dbms_random程式包,同時生成公有同義詞,並授權給所有資料庫使用者有執行的許可權。

使用dbms_random程式包, 取出隨機資料的方法:

1. 先建立乙個唯一增長的序列號tmp_id:   

create sequence tmp_id increment by 1 start with 1

maxvalue 9999999 nocycle nocache;

2. 然後建立乙個臨時表tmp_1,把符合本次活動條件的記錄全部取出來:   

create table tmp_1 as select tmp_id.nextval as id,

email,mobileno from 表名 where 條件;

找到最大的id號:select max(id) from tmp_1;。

3. 設定乙個生成隨機數的種子:   

execute dbms_random.seed(12345678);

或者execute dbms_random.seed

(to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));

4. 呼叫隨機數生成函式dbms_random.value生成臨時表tmp_2(假設隨機取200個):   

create table tmp_2 as select trunc

(dbms_random.value(1,5000)) as id from tmp_1 where rownum<201;

[ 說明:dbms_random.value(1,5000)是取1到5000間的隨機數,會有小數,

trunc函式對隨機數字取整,才能和臨時表的整數id欄位相對應。

注重:假如tmp_1記錄比較多(10萬條以上),也可以找乙個約大於兩百行的表(假如是tmp_3)來生成tmp_2   

create table tmp_2 as select trunc(dbms_random.value(1,5000)) as id from tmp_3 where rownum<201; ]

5. tmp_1和tmp_2相關聯取得符合條件的200使用者   

select t1.mobileno,t1.email from tmp_1 t1,

tmp_2 t2 where t1.id=t2.id;

[ 注重:假如tmp_1記錄比較多(10萬條以上),需要在id欄位上建索引。]

也可以輸出到文字檔案:   

set pagesize 300;

spool /tmp/200.txt;

select t1.mobileno,t1.email from tmp_1 t1,

tmp_2 t2 where t1.id=t2.id order by t1.mobileno;

spool off;

6. 用完後,刪除臨時表tmp_1、tmp_2和序列號tmp_id。

例項講解Oracle裡抽取隨機數的多種方法

在你的工作中是否會為了某個活動要隨機取出一些符合條件的email或者手機號碼使用者,來頒發獲獎通知或其它訊息?本文以例項的方式來講解如何抽取隨機數的多種方法。注意 如果tmp 1記錄比較多 10萬條以上 也可以找乙個約大於兩百行的表 假如是tmp 3 來生成tmp 2 以下是引用片段 create ...

qt裡產生隨機數

先說一下rand 與srand 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。比如 世上...

qt裡產生隨機數

本文摘自 先說一下rand 與srand 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。...