• oracle使用DBMS_RANDOM包生成随机数据


    (一)DBMS_RANDOM包信息

    DBMS_RANDOM包包含3个存储过程,4个函数,1个类型,一共8个模块,如下。

    SQL> desc dbms_random
    Element    Type      
    ---------- --------- 
    VALUE      FUNCTION  
    NORMAL     FUNCTION  
    STRING     FUNCTION  
    RANDOM     FUNCTION  
    INITIALIZE PROCEDURE 
    SEED       PROCEDURE
    TERMINATE  PROCEDURE 
    NUM_ARRAY  TYPE 

    (二)各个模块的用法

    (2.1)dbms_random.value ( function)

    如果不输入任何参数,该函数默认返回一个0到1之间的随机数字。准确的说,该小数取值范围为[0,1),即包含0但是不包含1。在小数点右边有38位数字。

    如果输入最小值和最大值,那么将会返回一个在最小值和最大值之间的数据。

    语法:

    DBMS_RANDOM.VALUE
        RETURN NUMBER;
    
    --或是
    DBMS_RANDOM.VALUE(
          low     IN    NUMBER                            
          high    IN    NUMBER)
        RETURN NUMBER;

    例子:

    --默认生成0到1之间的随机数
    SQL> select dbms_random.value from dual;
    
         VALUE
    ----------
    0.28510444
    
    
    --输入上下限,生成10~20之间的随机数
    SQL> select dbms_random.value(10,20) from dual;
    
    DBMS_RANDOM.VALUE(10,20)
    ------------------------
            14.8069717352864

    (2.2)dbms_random.normal(function)

     生成一个正态分布的随机数,关于正态分布,从网上查找资料,大致可以了解到,通过dbms_random.normal生成的数据,其分布范围为:

    从-1到1之间的数据占68%,从-2到2之间的数据占95%,从-3到3之间的数据占99%

                                      图1.正态分布

     语法:

    -- 注意,该function没有输入参数
    DBMS_RAMDOM.NORMAL
        RETURN NUMBER;

    例子:

    SQL> select dbms_random.normal from dual;
    
        NORMAL
    ----------
    0.35939267

    (2.3)dbms_random.string(function)

     该函数生成一个随机字符串。

    语法:

    DBMS_RANDOM.STRING(
         opt        IN    CHAR,
         len        IN    NUMBER)
      RETURN VARCHAR2;

     该函数需要传入2个参数,opt

    Parameter Description
    opt

    用来定义返回的字符串的样式:

    • 'u', 'U' --返回大写字母的字符串
    • 'l', 'L' --返回小写字母的字符串
    • 'a', 'A' --返回大小写混合的字符串
    • 'x', 'X' -- 返回大写字母与数字结合的字符串
    • 'p', 'P' --返回任何可打印的字符串

    否则返回大写字母字符串。

    len 返回字符串的长度

    例子:

    --返回大写字母组成的字符串
    SQL> select dbms_random.string('u',10) from dual;
    DBMS_RANDOM.STRING('U',10)
    ------------------------------------
    RLYKTDIRGI
    
    --返回小写字母组成的字符串
    SQL> select dbms_random.string('l',10) from dual;
    DBMS_RANDOM.STRING('L',10)
    -------------------------------------
    auyuhusjfe
    
    --返回大小写混合的字符串
    SQL> select dbms_random.string('a',10) from dual;
    DBMS_RANDOM.STRING('A',10)
    -------------------------------------
    OyNQIrlzVW
    
    --返回大写字母+数字混合的字符串
    SQL> select dbms_random.string('x',10) from dual;
    DBMS_RANDOM.STRING('X',10)
    -----------------------------------------
    XEXVNQ7Y5R
    
    --返回任意可以打印的字符串
    SQL> select dbms_random.string('p',10) from dual;
    DBMS_RANDOM.STRING('P',10)
    --------------------------------------
    .ZPb-V.i.-
    
    --如果指定的不是上面的参数,则返回大写字母组成的字符串
    SQL> select dbms_random.string('s',10) from dual;
    DBMS_RANDOM.STRING('S',10)
    ------------------------------------
    POLCDVHRKE

    (2.4)dbms_random.random(function)

    返回一个大于或等于-power(2,31)到小于或等于power(2,31)的随机数。不过Oracle不建议使用该函数,因为在11gR1中废弃了。

    “Note:This procedure is deprecated with Release 11gR1 and, although currently supported, it should not be used.”

    语法:

    DBMS_RANDOM.RANDOM
        RETURN binary_integer;

     例子

    SQL> select dbms_random.random from dual;
    
        RANDOM
    ----------
     325418642

    (2.5)dbms_random.initialize(procedure)

    该存储过程用于初始化生成器。与ramdom一样,Oracle不建议使用该函数,因为在11gR1中废弃了。

    该存储过程已经过时,因为它只是简单的调用seed存储过程(原文:This procedure is obsolete as it simply calls the SEED Procedures.)

    语法:

    DBMS_RANDOM.INITIALIZE(
        val    IN       BINARY_INTEGER);

     (2.6)dbms_random.seed(procedure)

    该存储过程用于设定种子。在设定种子之后,可以确保每次执行输出的结果相同。

    语法:

    DBMS_RANDOM.SEED (
         val     IN    BINARY_INTEGER);
    
    --或者
    DBMS_RANDOM.SEED (
        val      IN    VARCHAR2);

    例子:

    --未设定seed,2次执行同一个pl/sql块,结果不同
    
    --第1次执行 SQL> begin 2 for i in 1..5 loop 3 dbms_output.put_line(dbms_random.value(1,10)); 4 end loop; 5 end; 6 / 7.59767929575396153812259452034656438431 6.97539265222375730852839307412202430431 7.33806531652342308613878338447091428107 4.89245334013733738508437786557633898074 1.38879870308996313960638201385754773661 PL/SQL procedure successfully completed --第2次执行 SQL> begin 2 for i in 1..5 loop 3 dbms_output.put_line(dbms_random.value(1,10)); 4 end loop; 5 end; 6 / 8.1683965227100007068358716650335800015 5.43375383239697580591581003445848864422 4.69519556951657412911331859048606134568 1.98874282533230976261862622335817894101 6.57191642048605638448861960830764815336 PL/SQL procedure successfully completed
    --设定seed,2次执行同一个pl/sql块,结果相同

    --第1次执行
    SQL> begin 2 dbms_random.seed('jiaman'); 3 for i in 1..5 loop 4 dbms_output.put_line(dbms_random.value(1,10)); 5 end loop; 6 end; 7 / 7.88871486248578462461220968538206416509 9.9339215654944111380218579659105820674 9.26587220376346888918600380784743125956 9.9630882208005389088257850931854514369 3.35183691734731293112104762732782208283 PL/SQL procedure successfully completed
    --第2次执行 SQL
    > begin 2 dbms_random.seed('jiaman'); 3 for i in 1..5 loop 4 dbms_output.put_line(dbms_random.value(1,10)); 5 end loop; 6 end; 7 / 7.88871486248578462461220968538206416509 9.9339215654944111380218579659105820674 9.26587220376346888918600380784743125956 9.9630882208005389088257850931854514369 3.35183691734731293112104762732782208283 PL/SQL procedure successfully completed

     (2.7)dbms_random.terminate(procedure)

    当用完dbms_random包后,调用terminate存储过程。11gR1 版本不推荐使用此过程, 虽然当前支持, 但不应使用此过程。

    语法:

    dDBMS_RANDOM.TERMINATE;

    (2.8)dbms_random.num_array(type)


    参考文档:https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_random.htm#ARPLS67506

  • 相关阅读:
    MSSQL锁定1.Isolation level (myBased)
    等待状态CXPACKET分析
    拒绝了对对象 'sp_sdidebug'(数据库 'master',所有者 'dbo')的 EXECUTE 权限
    Oracle CBO 统计信息的收集与执行计划的选择
    Oracle 11gR1 on Win7
    读书笔记 <<你的知识需要管理>>
    ORA01555 总结
    Buffer Cache Management
    如何选择合适的索引
    书评 <SQL Server 2005 Performance Tuning性能调校> 竟然能够如此的不用心........
  • 原文地址:https://www.cnblogs.com/lijiaman/p/10327166.html
Copyright © 2020-2023  润新知