在你的工作中是否會為了某個活動要隨機取出一些符合條件的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 這兩個函式的用法 所謂的 偽隨機數 指的並不是假的隨機數,這裡的 偽 是有規律的意思。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機 數。計算機生成的偽隨機數既是隨機的又是有規律的 一部份遵守一定的規律,一部份則不遵守任何規律。...