迁移 Oracle 到 PostgreSQL: DBMS_RANDOM 包

七月 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));

有关详细信息,请参阅 PostgreSQL 文档中的数学函数和运算符字符串函数和运算符