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

原文地址:https://www.cnblogs.com/lijiaman/p/10327166.html

时间: 2024-11-02 01:00:58

oracle使用DBMS_RANDOM包生成随机数据的相关文章

Oracle之DBMS_RANDOM包详解

DBMS_RANDOM是Oracle提供的一个PL/SQL包,用于生成随机数据和字符.它具有以下函数. 其中,initialize,random,terminate函数在Oracle11g中已不推荐使用,主要用于向后兼容.下面对各个函数进行举例说明 1. INITIALIZE 用一个种子值来初始化DBMS_RANDOM包. 默认情况下,DBMS_RANDOM包是根据用户.时间.会话来进行初始化,这样,即便是同一个语句,每次生成的数值都会不一样,但这样会产生一个问题,在测试环境下,如果我想每次生成

Python一个可以生成随机数据的库

发现一个十分有用的库 faker,作用竟是可以生成各种各样的随机数据 新版本要使用 pip install fake-factory 而不能直接 pip install fake git:https://github.com/joke2k/faker文档:http://fake-factory.readthedocs.io/en/master/index.html 文档十分清楚, 用法就是这样的了, #-*- coding:utf-8 -*- from faker import Factory

mock的命名用一(生成随机数据)

Mock.Random 是一个工具类,用于生成各种随机数据. Mock.Random 的方法在数据模板中称为『占位符』,书写格式为 @占位符(参数 [, 参数]) . var Random = Mock.Random Random.email() // => "[email protected]" Mock.mock('@email') // => "[email protected]" Mock.mock( { email: '@email' } )

Python 脚本生成测试数据,Python生成随机数据,Python生成大量数据保存到文件夹中

代码如下: import random import datetime import time dataCount = 10*100*100 #10M. codeRange = range(ord('a'),ord('z')) alphaRange = [chr(x) for x in codeRange] alphaMax = len(alphaRange) daysMax = 42003 theDay = datetime.date(1900,1,1) def genRandomName(n

前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)

摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开发的应用(嘿嘿,毕竟这个mock应用的开发人员较多). 内容 1.Mock的安装 根据官方文档安装mock,运行安装命令安装即可. npm install mockjs 2.Mock的简单介绍 2.1.mock数据模板定义 根据官方文档示例介绍,输出一个随机数的‘*’字符串来展示mock的数据模板,

python3生成随机数据,并存入sqlite3

#!/usr/bin/python #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time    : 2018/6/15 22:46 # @Author  : Kwan # @File    : insert_db.py # @Software: PyCharm import sqlite3 import random import datetime # conn = sqlite3.connect('local.db') # # c = co

[转]一个简单的生成随机手机/电话号码/身份证号/银行卡号/地址/电子邮件等的Oracle小程序

在某些场景下我们可能需要生成一些随机数据,比如在测试环境中生成手机号.电子邮件地址等数据用来进行功能测试.或者将生产的数据导入到测试环境中,进行简单的脱敏处理.这是我在DBMS_RANDOM的基础上进行扩展开发的能够生成: 手机号码 电话号码 电子邮件 身份证号 银行卡号 住址 的一个Oracle Package,有兴趣的朋友可以从这里下载:http://pan.baidu.com/s/1pJBkVyF当然限于个人能力等原因,还有许多不足,恳请指正. 生成随机手机号码: 点击(此处)折叠或打开

机器学习算法的随机数据生成

在学习机器学习算法的过程中,我们经常需要数据来验证算法,调试参数.但是找到一组十分合适某种特定算法类型的数据样本却不那么容易.还好numpy, scikit-learn都提供了随机数据生成的功能,我们可以自己生成适合某一种模型的数据,用随机数据来做清洗,归一化,转换,然后选择模型与算法做拟合和预测.下面对scikit-learn和numpy生成数据样本的方法做一个总结. 1. numpy随机数据生成API numpy比较适合用来生产一些简单的抽样数据.API都在random类中,常见的API有:

随机数据的生成

import numpy as np # (1)random(d0,d1,....dn)用来生成d0*d1*....*dn维的数组.数组的值在[0,1)之间 np.random.rand(3,2,2)#生成一个3*2*2的数组 array([[[0.10141273, 0.97087629], [0.57045156, 0.62780166]], [[0.15425975, 0.21828791], [0.03630166, 0.60174227]], [[0.20345412, 0.51719