首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 隨機抽樣實戰:DBMS_RANDOM 多種抽取隨機數方法詳解

     編輯:Oracle 資料庫相關知識

準備工作

  1. 以 SYS 執行 @$ORACLE_HOME/rdbms/admin/dbmsrand.sql 建立 DBMS_RANDOM 套件並授權 PUBLIC。
  2. 建立遞增序列 tmp_id 與暫存表 tmp_1 裝載符合條件的目標資料。
CREATE SEQUENCE tmp_id INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;
CREATE TABLE tmp_1 AS SELECT tmp_id.NEXTVAL AS id, email, mobileno FROM target_table WHERE conditions;
-- 取得最大 id
SELECT MAX(id) FROM tmp_1;

三種隨機抽樣寫法

方法一:固定種子(可重現)

EXEC DBMS_RANDOM.SEED(12345678);

方法二:時間種子(不可重現)

EXEC DBMS_RANDOM.SEED(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));

方法三:直接取隨機值(不設種子)

SELECT DBMS_RANDOM.VALUE(1, max_id) FROM DUAL;

完整抽樣流程範例

DECLARE
  v_max_id NUMBER;
  v_rand_id NUMBER;
  v_email VARCHAR2(100);
BEGIN
  SELECT MAX(id) INTO v_max_id FROM tmp_1;
  -- 產生 10 筆不重複隨機 id
  FOR i IN 1..10 LOOP
    v_rand_id := TRUNC(DBMS_RANDOM.VALUE(1, v_max_id+1));
    SELECT email INTO v_email FROM tmp_1 WHERE id = v_rand_id;
    DBMS_OUTPUT.PUT_LINE(v_email);
  END LOOP;
END;
/

注意事項

  • 大量資料建議先抽樣至暫存表再隨機,避免全表掃描。
  • 需不重複抽樣時,可在 PL/SQL 中用陣列或暫存表去重。
  • DBMS_RANDOM 非加密級隨機,不可用於密鑰生成。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved