select * from (select * from t_consumer order by dbms_random.value) where rownum<3
====================以下搜罗了网络上一些关于Oracle随机数的帖子=============
ORDER BY DBMS_RANDOM.VALUEdbms_random.value(100,200),dbms_random.string('A',10)
SELECT *
FROM (SELECT EMPNO, ENAME FROM SCOTT.EMP ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM <3> 注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sql
dbms_random.value(100,200)可以产生100到200范围的随机数
取排序后的前3条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn 取排序后的第4-6条记录:
SELECT *
FROM (SELECT EMPNO, ENAME, rownum rn FROM SCOTT.EMP ORDER BY 1)
WHERE rn between 4 and 6;
11.13 随机产生N个字符串
select dbms_random.string('A',10) from dual;
========================
Oracle随机函数—dbms_random
1.基础认识
关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中:
select text from all_source
where name = 'DBMS_RANDOM'
and type = 'PACKAGE' order by line;
◆ TYPE num_array
◆ PROCEDURE terminate
◆ PROCEDURE seed
◆ PROCEDURE initialize
◆ FUNCTION random
◆ FUNCTION value RETURN NUMBER;
◆ FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
◆ FUNCTION normal RETURN NUMBER;
◆ FUNCTION string (opt char, len NUMBER) RETURN VARCHAR2;
2.应用举例
SELECT DBMS_RANDOM.RANDOM FROM DUAL;
再进一步的要求,比如,产生一个0-100的随机数,稍微变通一下就可以了:
select abs(mod(dbms_random.random,100)) from dual
3.进阶说明
dbms_random又有新函数了可以实现这些功能
FUNCTION value RETURN NUMBER;
FUNCTION value (low IN NUMBER, high IN NUMBER) RETURN NUMBER;
FUNCTION normal RETURN NUMBER;
FUNCTION string (opt char, len NUMBER) RETURN VARCHAR2;
产生N到M之间的随机数
SELECT DBMS_RANDOM.VALUE(N,M) FROM DUAL;
缺省DBMS_RANDOM.VALUE返回0到1之间的随机数
SQL> select dbms_random.value, dbms_random.value(55,100) from dual;
VALUE DBMS_RANDOM.VALUE(55,100)
--------------- -----------------------------
0.714469037747011 68.5593418279622
NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。
最后,是STRING函数。它返回一个长度达60个字符的随机字符串。
用DBMS_RANDOM生成文本和日期值
数字、文本字符串和日期都是用户会在表格里碰到的三种常见数据类型。虽然你可以用PL/SQL程序包里的DBMS_RANDOM随机生成数字——它确实能够做到这一点——它还能够随机生成文本和日期值。
1.产生随机数字
就让我们先从数字开始。VALUE函数会返回一个大于等于0但是小于1的数,精度是38位。
SELECT DBMS_RANDOM.VALUE FROM DUAL;
对于指定范围内的整数,要加入参数low_value和high_value,并从结果中截取小数(最大值不能被作为可能的值)。所以对于0到99之间的整数,你要使用下面的代码:
SELECT TRUNC(DBMS_RANDOM.VALUE(0, 100)) FROM DUAL;
2.产生随机文本字符串
要随机生成文本字符串,就要使用STRING函数并编写代码指定字符串的类型和所希望的长度:
SELECT DBMS_RANDOM.STRING('A', 20) FROM DUAL;
类型代码在《Oracle Database 10g PL/SQL程序包和类型参考(Oracle Database 10g PL/SQL Packages and Types Reference)》有说明。
下面是一些类型的代码:
‘U’用来生成大写字符
‘L’用来生成小写字符
‘A’用来生成大小写混合的字符
3.产生随机日期
Oracle将日期作为过去某个关键日期(如果你好奇的话,我可以告诉你这个日期是公元前4712年1月1日)的整数偏移量来保存。这就意味着你可以通过寻找与你希望的起始日期相对应的整数,然后向它加入一个随机的整数来随机生成一个指定范围内的日期。
使用TO_CHAR函数和‘J’格式代码,你可以为今天的日期生成一个内部日期数:
SELECT TO_CHAR(SYSDATE, 'J') FROM DUAL;
例如,要生成一个2003年内的任意日期,你可以首先确定2003年1月1日的日期整数;
SELECT TO_CHAR(TO_DATE('01/01/03','mm/dd/yy'),'J')FROM DUAL;
系统给的结果是2452641。所以要生成该年度内的任意日期,我们就要用带有low_value等于2452641和high_value等于2452641+364参数的DBMS_RANDOM.VALUE,再把它转换成日期:
SELECT TO_DATE(TRUNC(DBMS_RANDOM.VALUE(2452641,2452641+364)),'J') FROM DUAL;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luojun198610/archive/2009/02/27/3941491.aspx
========================
没事做简单看了一下Oracle随机函数的取法:
dbms_random
CREATE OR REPLACE PACKAGE SYS.dbms_random AS
------------
-- OVERVIEW
--
-- This package should be installed as SYS. It generates a sequence of
-- random 38-digit Oracle numbers. The expected length of the sequence
-- is about power(10,28), which is hopefully long enough.
--
--------
-- USAGE
--
-- This is a random number generator. Do not use for cryptography.
-- For more options the cryptographic toolkit should be used.
--
-- By default, the package is initialized with the current user
-- name, current time down to the second, and the current session.
--
-- If this package is seeded twice with the same seed, then accessed
-- in the same way, it will produce the same results in both cases.
--
--------
-- EXAMPLES
--
-- To initialize or reset the generator, call the seed procedure as in:
-- execute dbms_random.seed(12345678);
-- or
-- execute dbms_random.seed(TO_CHAR(SYSDATE,'MM-DD-YYYY HH24:MI:SS'));
-- To get the random number, simply call the function, e.g.
-- my_random_number BINARY_INTEGER;
-- my_random_number := dbms_random.random;
-- or
-- my_random_real NUMBER;
-- my_random_real := dbms_random.value;
-- To use in SQL statements:
-- select dbms_random.value from dual;
-- insert into a values (dbms_random.value);
-- variable x NUMBER;
-- execute := dbms_random.value;
-- update a set a2=a2+1 where a1 < ;
-- Seed with a binary integer
PROCEDURE seed(val IN BINARY_INTEGER );
PRAGMA restrict_references (seed, WNDS );
-- Seed with a string (up to length 2000)
PROCEDURE seed(val IN VARCHAR2 );
PRAGMA restrict_references (seed, WNDS );
-- Get a random 38-digit precision number, 0.0 <= value < 1.0
FUNCTION value RETURN NUMBER ;
PRAGMA restrict_references ( value , WNDS );
-- get a random Oracle number x, low <= x < high
FUNCTION value (low IN NUMBER , high IN NUMBER ) RETURN NUMBER ;
PRAGMA restrict_references ( value , WNDS );
-- get a random number from a normal distribution
FUNCTION normal RETURN NUMBER ;
PRAGMA restrict_references (normal, WNDS );
-- get a random string
FUNCTION string (opt char , len NUMBER )
/* "opt" specifies that the returned string may contain:
'u','U' : upper case alpha characters only
'l','L' : lower case alpha characters only
'a','A' : alpha characters only (mixed case)
'x','X' : any alpha-numeric characters (upper)
'p','P' : any printable characters
*/
RETURN VARCHAR2 ; -- string of
PRAGMA restrict_references ( string , WNDS );
-- Obsolete, just calls seed(val)
PROCEDURE initialize(val IN BINARY_INTEGER );
PRAGMA restrict_references (initialize, WNDS );
-- Obsolete, get integer in ( -power(2,31) <= random < power(2,31) )
FUNCTION random RETURN BINARY_INTEGER ;
PRAGMA restrict_references (random, WNDS );
-- Obsolete, does nothing
PROCEDURE terminate;
TYPE num_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
END dbms_random;
简单得说,通过dbms_random包调用随机数的方法大致有4种:
1、dbms_random.normal
这个函数不带参数,能返回normal distribution的一个number类型,所以基本上随机数会在-1到1之间。
简单测试了一下,产生100000次最大能到5左右:
SQL> declare
2 i number:=0;
3 j number:=0;
4 begin
5 for k in 1 .. 100000 loop
6 i:= dbms_random.normal;
7 if i > j
8 then j:=i;
9 end if;
10 end loop;
11 dbms_output.put_line(j);
12 end;
13 /
5.15325081797418404136433867107468983182
PL/SQL procedure successfully completed
2、dbms_random.random
这个也没有参数,返回一个从-power(2,31)到power(2,31)的整数值
3、dbms_random.value
这个函数分为两种,一种是没有参数,则直接返回0-1之间的38位小数
SQL > column value format 9.99999999999999999999999999999999999999
SQL > select dbms_random.value from dual;
VALUE
-----------------------------------------
.58983014999643548701631750396301271752
第二种是加上两个参数a、b,则返回值在a、b之间的38位小数
SQL > column value format 999.999999999999999999999999999999999999
SQL > select dbms_random.value(100,500) value from dual;
VALUE
-----------------------------------------
412.150194612502916808701157054098274240
注意:无论前面几位,小数点之后都是38位
4、dbms_random.string
这个函数必须带有两个参数,前面的字符指定类型,后面的数值指定位数(最大60)
类型说明:
'u','U' : upper case alpha characters only
'l','L' : lower case alpha characters only
'a','A' : alpha characters only (mixed case)
'x','X' : any alpha-numeric characters (upper)
'p','P' : any printable characters
SQL > column value format a30
SQL > select dbms_random.string('u',30) value from dual;
VALUE
------------------------------
VTQNLGISELPXEDBXKUZLXKBAJMUTIA
SQL > select dbms_random.string('l',30) value from dual;
VALUE
------------------------------
uqygsbquingfqdytpgjvdoblxeglgu
SQL > select dbms_random.string('a',30) value from dual;
VALUE
------------------------------
NGTGkQypuSWhBfcrHiOlQwOUXkqJjy
SQL > select dbms_random.string('x',30) value from dual;
VALUE
------------------------------
UVWONYJMXT31VEFPD736WJCJ5QT6BD
SQL > select dbms_random.string('p',30) value from dual;
VALUE
------------------------------
:mak$(WT4M_7c/+f[_XUscf$P Zcq{
5、关于seed
可以设置seed来确定随机数的起始点,对于相同的seed而言,随机数的任意一次变化都将是确定的。
就是说,如果在某一时刻调用了seed,之后第一次产生的随机数是4,第二次是6,第三次是1,那么当你再次调用相同的seed之后,一次产生的随机数还是4、6、1
seed有两种,一种是数值型的,一种是字符型(最大长度2000)的
-- Seed with a binary integer
PROCEDURE seed(val IN BINARY_INTEGER );
PRAGMA restrict_references (seed, WNDS );
-- Seed with a string (up to length 2000)
PROCEDURE seed(val IN VARCHAR2 );
PRAGMA restrict_references (seed, WNDS );
6、关于initialize
一个integer参数,注释说的很清楚了:
-- Obsolete, just calls seed(val)
PROCEDURE initialize(val IN BINARY_INTEGER );
PRAGMA restrict_references (initialize, WNDS );
sys_guid()
官方文档的说明如下:
SYS_GUID generates and returns a globally unique identifier (RAW value) made up of 16 bytes. On most platforms, the generated identifier consists of a host identifier, a process or thread identifier of the process or thread invoking the function, and a nonrepeating value (sequence of bytes) for that process or thread.
简单得说就是,随机生成一个32位的RAW,但是后面的那段经过实验发现不是这么回事,每次生成的字符串都千差万别,不知道为什么。
在具体应用中,除了可以用来插入生成唯一的标识符外,还可以用来取表中的任意一条记录:
select * from ( select * from t2 order by sys_guid()) where rownum = 1 ;
-The End-
==========
Oracle学习之二: 取整函数和随机函数
这次需要用取整函数,于是在网上查到了:
ceil(15.01) 只能取最接近但大于15.7的整数
结果:16
floor(15.73) 只能取最接近但小于15.7的整数
结果:15
trunc(15.79,1) 只能依据精确位来取,不会四舍五入
结果:15.7
round(15.79,1) 能依据精确位数来四舍五入
结果:15.8
trunc 和 round 中的"1"表示小数点 1 位,0 表示个位,-1 表示十位
随机函数如下:
dbms_random.value(v1, v2) v1 和 v2 两个参数是取值范围. 再配合上取整函数,就可以取得一个范围内的任何随机数了.