DBMS_RANDOM 用法


oracle中用於生成隨機數的包:DBMS_RANDOM,這個包里面包含了很多方法,以下列出幾個常用的方法

1.DBMS_RANDOM.RANDOM方法:

  • FUNCTION random RETURN BINARY_INTEGER;

  說明:random返回的是BINARY_INTEGER類型值,產生一個任意大小的隨機數(正或負)。

  示例:

SELECT DBMS_RANDOM.RANDOM FROM DUAL;
RANDOM
---------- -478838704

--產生一個任意大小的隨機正數 SELECT abs(DBMS_RANDOM.RANDOM/100) FROM DUAL;
ABS(DBMS_RANDOM.RANDOM/100) --------------------------- 698869.43

--產生一個100以內的隨機正數(mod取余,可指定其它數字以內的數) SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;
ABS(MOD(DBMS_RANDOM.RANDOM,100)) -------------------------------- 60

 

2.DBMS_RANDOM.VALUE用法:有兩種用法

  • FUNCTION value RETURN NUMBER;

  說明:這種用法沒有參數,會返回一個具有38位精度的數值,范圍從0.0到1.0,但不包括1.0。

  示例:

--產生一個0~1之間的隨機數
sql>SELECT dbms_random.value FROM dual;

     VALUE
----------
.625810105

--產生一個100~1000之間的隨機數,不帶小數(trunc)
sql>SELECT TRUNC(100+900*DBMS_RANDOM.VALUE) FROM dual;
TRUNC(
100+900*DBMS_RANDOM.VALUE) -------------------------------- 743
  • FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;

  說明:value帶有兩個參數,第一個指下限,第二個指上限,將會生成下限到上限之間的數字,但不包含上限。

  示例:

--產生一個10~20之間的隨機數
sql>SELECT dbms_random.value(10,20) FROM dual;

DBMS_RANDOM.VALUE(10,20)
------------------------
              11.1480576

3.DBMS_RANDOM.NORMAL用法:

  • FUNCTION normal RETURN NUMBER;

  說明:獲取正態分布的隨機數。此正態分布標准偏差為1,期望值為0。這個函數返回的數值中有68%是介於-1與+1之間,95%介於-2與+2之間,99%介於-3與+3之間。

  示例:

sql>BEGIN
      FOR i IN 1 .. 10 LOOP
        dbms_output.put_line(round(dbms_random.normal));
      END LOOP;
    END;
  /
0
0
0
0
-1
2
-1
-1
2
0
PL/SQL 過程已成功完成。

4.dbms_random.string用法:

  • FUNCTION string (opt CHAR, len NUMBER) RETURN VARCHAR2;

  說明:某些用戶管理程序可能需要為用戶創建隨機的密碼。使用10G下的dbms_random.string 可以實現這樣的功能。

  參數:opt :

  ■ 'u', 'U' - returning string in uppercase alpha characters >返回大寫字母

  ■ 'l', 'L' - returning string in lowercase alpha characters >返回小寫字母

  ■ 'a', 'A' - returning string in mixed case alpha characters >大小寫字母混合

  ■ 'x', 'X' - returning string in uppercase alpha-numericcharacters >大寫字母和數字混合

  ■ 'p', 'P' - returning string in any printable characters. >任意可顯示字符

  Otherwise the returning string is in uppercase alphacharacters. >當選項為其他字母的時候返回的內容仍將是大寫字母

  len :表示返回的字符串長度。

  示例:

sql> SELECT DBMS_RANDOM.STRING('u', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('U', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('l', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('L', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('a', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('A', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('x', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('X', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL
  UNION ALL
  SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL;

DBMS_RANDOM.STRING('U',10)
------------------------------------------------------------------
MBYRHYLAZA
QSZAEWXBTZ
pidhbftajy
erutcrkoqs
HIjazdaqws
zrjqndNkjh
UMNRRQDEKS
K18GHLWM40
&gp$fx5#Ik
<90<Luu%vT

5.dbms_random.seed用法

  • PROCEDURE seed(val IN BINARY_INTEGER);或PROCEDURE seed(val IN VARCHAR2);

  說明:用於生成一個隨機數種子,設置種子的目的是可以重復生成隨機數,用於調試。否則每次不同,難以調度。

  --可以設置seed來確定隨機數的起始點,對於相同的seed而言,隨機數的任意一次變化都將是確定的。
  – 就是說,如果在某一時刻調用了seed,之后第一次產生的隨機數是4,第二次是6,第三次是1,
  – 那么當你再次調用相同的seed之后,一次產生的隨機數還是4、6、1
  – seed有兩種,一種是數 型的,一種是字符型(最大長度2000)的

  示例:

--session1
SELECT USERENV('SESSIONID') FROM DUAL;   
  
USERENV('SESSIONID')   
--------------------   
            15140521   
  
SQL> BEGIN  
      dbms_random.seed(100);   
    END;   
    /   
  
PL/SQL procedure successfully completed   
  
SQL> SELECT DBMS_RANDOM.value   
    FROM DUAL   
    CONNECT BY LEVEL < 10;   
  
     VALUE   
----------   
0.53801770   
0.67499536   
0.65362270   
0.76351985   
0.29859834   
0.40522032   
0.99551636   
0.39565580   
0.18074760

 

--SESSION 2
SQL> SELECT USERENV('SESSIONID') FROM DUAL;   
  
USERENV('SESSIONID')   
--------------------   
            15140517   
  
SQL> BEGIN  
       dbms_random.seed(100);   
     END;   
      /   
  
PL/SQL procedure successfully completed   
  
SQL> SELECT DBMS_RANDOM.value FROM DUAL   
      CONNECT BY LEVEL < 10;   
  
     VALUE   
----------   
0.53801770   
0.67499536   
0.65362270   
0.76351985   
0.29859834   
0.40522032   
0.99551636   
0.39565580   
0.18074760   
  

注意:當隨機數據做為過濾條件時如下這么寫:會找不到數據、多行

 SELECT * FROM test WHERE n = ROUND(dbms_random.value(1,3));--可改成 n = (SELECT ROUND(dbms_random.value(1,3)) FROM dual)

SQL> SELECT n FROM test1 WHERE n = ROUND(dbms_random.value(1,3));
         N
----------
         1
         2
SQL> SELECT n FROM test1 WHERE n = ROUND(dbms_random.value(1,3)); 未選定行 SQL> SELECT n FROM test1 WHERE n = ROUND(dbms_random.value(1,3)); N ---------- 1

你無法預測或者控制SQL里面調用這個函數的次數。
正確的辦法是先將dbms_random.value存入變量,然后在SQL中使用這個變量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM