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中使用这个变量

  • 相关阅读:
    线段树扫描线求矩形面积并
    BZOJ-1103 [POI2007]大都市meg 【DFS序+树状数组】
    安徽大学第九届程序设计竞赛决赛题解
    如何解决Vue.js里面noVNC的截图问题(2)——蛋疼的cookies验证和node.js的websocket代理
    如何解决Vue.js里面noVNC的截图问题(1)——论可以跨域的webSocket
    从技术人视角看闪电网络之作用和局限性,以及一些问题的回答
    从技术人视角看闪电网络之闪电路由
    从技术人视角看闪电网络之微支付通道
    微服务化的大坑之一:当dubbo神器碰上共用注册中心和错误的暴露接口
    Fun论设计模式之1:简单工厂模式(Factory Pattern)
  • 原文地址:https://www.cnblogs.com/willspring/p/5680811.html
Copyright © 2011-2022 走看看