七月 27, 2023
Oracle 的DBMS_RANDOM
包提供了生成随机数或字符串的功能,作为 SQL 语句或 PL/SQL 过程的一部分。
Oracle 用法
DBMS_RANDOM
包的存储过程包括:
- NORMAL — 返回标准正态分布中的随机数。
- SEED — 重置生成随机数或字符串的种子。
- STRING — 返回随机字符串。
- VALUE — 返回大于或等于 0 且小于 1 的数字,小数点右侧有 38 位数字。或者,您可以生成一个大于或等于低参数和小于高参数的随机数。
DBMS_RANDOM.RANDOM
生成 [-2^^31, 2^^31] 范围内的整数。
DBMS_RANDOM.VALUE
生成 [0,1] 范围内的数字,精度为 38 位。
例子
生成一个随机数。
select dbms_random.value() from dual;
DBMS_RANDOM.VALUE()
.859251508
select dbms_random.value() from dual;
DBMS_RANDOM.VALUE()
.364792387
生成一个随机字符串。第一个字符确定返回的字符串类型,数字指定长度。
select dbms_random.string('p',10) from dual;
DBMS_RANDOM.STRING('P',10)
la'?z[Q&/2
select dbms_random.string('p',10) from dual;
DBMS_RANDOM.STRING('P',10)
t?!Gf2M60q
有关详细信息,请参阅 Oracle 文档中的 DBMS_RANDOM。
PostgreSQL 用法
PostgreSQL不提供等同于Oracle DBMS_RANDOM
的专用包,1:1 的迁移是不可能的。但是,在某些情况下,您可以使用其他 PostgreSQL 函数作为解决方法。例如,可以使用random()
函数生成随机数。要生成随机字符串,可以使用从random()
函数返回的值与md5()
函数结合。
例子
生成一个随机数。
select random();
random
0.866594325285405
(1 row)
select random();
random
0.524613124784082
(1 row)
生成一个随机字符串。
select md5(random()::text);
md5
f83e73114eccfed571b43777b99e0795
(1 row)
select md5(random()::text);
md5
d46de3ce24a99d5761bb34bfb6579848
(1 row)
若要生成指定长度的随机字符串,可以使用以下函数。
create or replace function random_string(length integer) returns text as
$$
declare
chars text[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
result text := '';
i integer := 0;
begin
if length < 0 then
raise exception 'Given length cannot be less than 0';
end if;
for i in 1..length loop
result := result || chars[1+random()*(array_length(chars, 1)-1)];
end loop;
return result;
end;
$$ language plpgsql;
下面的代码示例演示使用此函数的结果。
select random_string(15);
random_string
5emZKMYxB9C2vT6
(1 row)
select random_string(10);
random_string
tMAxfql0iM
(1 row)
总结
描述 | Oracle | PostgreSQL |
---|---|---|
生成随机数 | select dbms_random.value() from dual; |
select random(); |
生成一个介于 1 到 100 之间的随机数 | select dbms_random.value(1,100) from dual; |
select random()*100; |
生成随机字符串 | select dbms_random.string('p',10) from dual; |
select md5(random()::text); |
生成大写的随机字符串 | select dbms_random.string('U',10) from dual; |
select upper(md5(random()::text)); |