zoukankan      html  css  js  c++  java
  • 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中使用这个变量

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/willspring/p/5680811.html
Copyright © 2011-2022 走看看