PLSQL专项学习之DBMS_RANDOM包

作用说明:

DBMS_RANDOM包提供了一个内置的随机数生成器。里面包含了很多的方法。

 DBMS_RANDOM子程序的摘要:

方法描述

INITIALIZE procedure

用种子值初始化包。

NORMAL function

返回正态分布中的随机数。

RANDOM function

生成一个随机数。

SEED procedure

重置种子。

STRING function

获取一个随机字符串。

TERMINATE procedure

终止包。

VALUE function

一个版本获得一个大于或等于0且小于1的随机数,小数点右边有38位(38位精度)。另一个版本获得一个随机Oracle数据库号x,其中x大于或等于一个指定的下限,而小于一个指定的上限。

 常用方法案例:

1. DBMS_RANDOM.RANDOM方法:

语法:DBMS_RANDOM.RANDOM RETURN binary_integer;

说明:random返回的是BINARY_INTEGER类型值,产生一个任意大小的随机数(正或负)。

SQL> SELECT DBMS_RANDOM.RANDOM FROM DUAL;
 
    RANDOM
----------
-900131307
 
--产生一个任意大小的随机正数
SQL> SELECT abs(DBMS_RANDOM.RANDOM/100) FROM DUAL;
 
ABS(DBMS_RANDOM.RANDOM/100)
---------------------------
                19653484.99
 
--产生一个100以内的随机正数(mod取余,可指定其它数字以内的数)
SQL> SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;
 
ABS(MOD(DBMS_RANDOM.RANDOM,100
------------------------------
                            28

2.DBMS_RANDOM.VALUE用法:有两种用法

语法:

DBMS_RANDOM.VALUE
  RETURN NUMBER;

DBMS_RANDOM.VALUE(
  low  IN  NUMBER,
  high IN  NUMBER)
RETURN NUMBER;

FUNCTION value RETURN NUMBER;

  说明:这种用法没有参数,会返回一个具有38位精度的数值,范围从0.0到1.0,但不包括1.0。

  示例:

--产生一个0~1之间的随机数
sql>SELECT dbms_random.value FROM dual;

     VALUE
----------
0.24031434

--产生一个100~1000之间的随机数,不带小数(trunc)
sql>SELECT TRUNC(100+900*DBMS_RANDOM.VALUE) FROM dual;

TRUNC(100+900*DBMS_RANDOM.VALUE)
--------------------------------
122
  • 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)
------------------------
                 16.5068343718981

3.DBMS_RANDOM.NORMAL用法:

语法:DBMS_RANDOM.NORMAL RETURN NUMBER;

 

 说明:获取正态分布的随机数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。

  示例:

SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
1
 
PL/SQL procedure successfully completed
 
SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
0
 
PL/SQL procedure successfully completed
 
SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
-1
 
PL/SQL procedure successfully completed
 
SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
0
 
PL/SQL procedure successfully completed
 
SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
1
 
PL/SQL procedure successfully completed
 
SQL> exec dbms_output.put_line(round(dbms_random.normal));
 
-2
 
PL/SQL procedure successfully completed
 

4.dbms_random.string用法:

 语法:

DBMS_RANDOM.STRING
   opt  IN  CHAR,
   len  IN  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
  2    UNION ALL
  3    SELECT DBMS_RANDOM.STRING('U', 10) FROM DUAL
  4    UNION ALL
  5    SELECT DBMS_RANDOM.STRING('l', 10) FROM DUAL
  6    UNION ALL
  7    SELECT DBMS_RANDOM.STRING('L', 10) FROM DUAL
  8    UNION ALL
  9    SELECT DBMS_RANDOM.STRING('a', 10) FROM DUAL
 10    UNION ALL
 11    SELECT DBMS_RANDOM.STRING('A', 10) FROM DUAL
 12    UNION ALL
 13    SELECT DBMS_RANDOM.STRING('x', 10) FROM DUAL
 14    UNION ALL
 15    SELECT DBMS_RANDOM.STRING('X', 10) FROM DUAL
 16    UNION ALL
 17    SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL
 18    UNION ALL
 19    SELECT DBMS_RANDOM.STRING('P', 10) FROM DUAL;
 
DBMS_RANDOM.STRING('U',10)
--------------------------------------------------------------------------------
XZMZMEOIDC
ZXYHCYGLUX
gbyajvsacl
wtrbzznbvq
TOxeaGftRN
zjyMaNpJze
NF2T5ZWGCX
LMPQHR6JWP
'`a%bD"J6}
X.NvIQ9s$q
 
10 rows selected
 

5.dbms_random.seed用法

 语法:

DBMS_RANDOM.SEED (
   val  IN  BINARY_INTEGER);

DBMS_RANDOM.SEED (
   val  IN  VARCHAR2);

说明:用于生成一个随机数种子,设置种子的目的是可以重复生成随机数,用于调试。否则每次不同,难以调度。

  --可以设置seed来确定随机数的起始点,对于相同的seed而言,随机数的任意一次变化都将是确定的。
  – 就是说,如果在某一时刻调用了seed,之后第一次产生的随机数是4,第二次是6,第三次是1,
  – 那么当你再次调用相同的seed之后,一次产生的随机数还是4、6、1
  – seed有两种,一种是数 型的,一种是字符型(最大长度2000)的

--session1
SELECT USERENV('SESSIONID') FROM DUAL;   
  
USERENV('SESSIONID')   
--------------------   
  865219
  
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')   
--------------------   
  
  
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

注意:当随机数据做为过滤条件时如下这么写:会找不到数据、多行

 

 

SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         3
         2
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         1
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         1
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         1
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         2
         1
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         3
         2
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         3
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         1
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         1
         2
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         2
         1
         2
 
SQL>  SELECT * FROM test WHERE col = ROUND(dbms_random.value(1,3));
 
       COL
----------
         3
         1
         2
         1
 

SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         1
         1
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         3
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         1
         1
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         2
         2
 
SQL>   SELECT * FROM test WHERE col =(SELECT ROUND(dbms_random.value(1,3)) FROM dual);
 
       COL
----------
         1
         1

供参考。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥真不错

您的鼓励,将是我最大的坚持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值