博客
关于我
oracle使用DBMS_RANDOM包生成随机数据
阅读量:425 次
发布时间:2019-03-06

本文共 4935 字,大约阅读时间需要 16 分钟。

 

(一)DBMS_RANDOM包信息

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

SQL> desc dbms_randomElement    Type      ---------- --------- VALUE      FUNCTION  NORMAL     FUNCTION  STRING     FUNCTION  RANDOM     FUNCTION  INITIALIZE PROCEDURE SEED       PROCEDURETERMINATE  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 .)

语法:

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.597679295753961538122594520346564384316.975392652223757308528393074122024304317.338065316523423086138783384470914281074.892453340137337385084377865576338980741.38879870308996313960638201385754773661PL/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.16839652271000070683587166503358000155.433753832396975805915810034458488644224.695195569516574129113318590486061345681.988742825332309762618626223358178941016.57191642048605638448861960830764815336PL/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.888714862485784624612209685382064165099.93392156549441113802185796591058206749.265872203763468889186003807847431259569.96308822080053890882578509318545143693.35183691734731293112104762732782208283PL/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.888714862485784624612209685382064165099.93392156549441113802185796591058206749.265872203763468889186003807847431259569.96308822080053890882578509318545143693.35183691734731293112104762732782208283PL/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

 

转载地址:http://susyz.baihongyu.com/

你可能感兴趣的文章
iOS UISlider的使用
查看>>
iOS Xcode 打包之后,不能输出日志
查看>>
UIPickerView的使用(二)
查看>>
iOS 多线程GCD简介
查看>>
不想eject,还咋修改create-react-app的配置?
查看>>
实现延迟消息队列
查看>>
写了一下 micropython 的文件系统单元测试
查看>>
说说字库和字模的故事,然后在 MaixPy 里实现打印中文字体(任意字体)吧!
查看>>
linux kernel version magic 不一致导致的模块 加载 (insmod) 不上
查看>>
线性代数应该这样学9:上三角矩阵、对角矩阵
查看>>
【科学计算】插值理论
查看>>
centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解
查看>>
深度学习一:深度前馈网络和反向传播
查看>>
在wxPython使ListCtrl占据整个窗口
查看>>
微软面试题
查看>>
Google新玩法(转载)
查看>>
C#中Dispose和Close的区别!
查看>>
如何让服务在流量暴增的情况下保持稳定输出
查看>>
一个20年技术老兵的 2020 年度技术总结
查看>>
一例完整的websocket实现群聊demo
查看>>