oracle存储过程如何生成18位3不相同的随机数?

时间:2022-01-06 03:33:26
写了个存储过程部分如下:

v_num  number;
v_id  varchar2(30);
Cursor cur_dzk Is Select * From t_user_jbxx t Order By t.userid;
begin
   v_num:=0;
   For cur_mlxz In cur_dzk Loop
    v_num:=v_num+1;
   v_id   :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999));  
   insert into t_user_jbxx (id)values(v_id);
   
   end loop;
  if (v_num mod 1000)=0 then
   commit;
  end if;

commit;

end;

结果发现这个表中的id既然有很多重复的,奇怪了,按理说每次循环时间都变的啊 ,是不是电脑执行太快了,一秒钟循环了很多此,才导致有重复的?有其他办法吗,生产随机数,主要是后18位?

6 个解决方案

#1


随机数不能保证不重复,即然你已经使用循环了,使用v_num来拼接不就行了
v_id  := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');

或者使用序列sequence来生成ID保证唯一性。

#2


引用楼主 ecjtuhr 的回复:
写了个存储过程部分如下:

v_num number;
v_id varchar2(30);
Cursor cur_dzk Is Select * From t_user_jbxx t Order By t.userid;
begin
  v_num:=0;
  For cur_mlxz In cur_dzk Loop
  v_num:=v_num+1;
  v_id :='00……


1:且不说别的 
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999));  这里就有错误
改为
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')||TRUNC(DBMS_RANDOM.value(1000,9999))
 2.DBMS_RANDOM.value(1000,9999)用这个本来就有重复的

要想唯一可以这样
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num);
或者用序列加触发器

#3


v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num,'fm0000');

#4


有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。

#5


引用 4 楼 jerrymao 的回复:
有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。

因为sys_guid()有字母,而我只要纯数字。

#6


你可以做个字母到数字的对换。。。

#1


随机数不能保证不重复,即然你已经使用循环了,使用v_num来拼接不就行了
v_id  := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');

或者使用序列sequence来生成ID保证唯一性。

#2


引用楼主 ecjtuhr 的回复:
写了个存储过程部分如下:

v_num number;
v_id varchar2(30);
Cursor cur_dzk Is Select * From t_user_jbxx t Order By t.userid;
begin
  v_num:=0;
  For cur_mlxz In cur_dzk Loop
  v_num:=v_num+1;
  v_id :='00……


1:且不说别的 
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')TRUNC(DBMS_RANDOM.value(1000,9999));  这里就有错误
改为
'000000000000'||to_char(sysdate,'yyyymmddhh24miss')||TRUNC(DBMS_RANDOM.value(1000,9999))
 2.DBMS_RANDOM.value(1000,9999)用这个本来就有重复的

要想唯一可以这样
v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num);
或者用序列加触发器

#3


v_id :='000000000000'||to_char(sysdate,'yyyymmddhh24miss')||to_char(v_num,'fm0000');

#4


有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。

#5


引用 4 楼 jerrymao 的回复:
有个系统函数你可以用一下,sys_guid() 可以生成32位的唯一数,保证每次生成的都不一样。如果只要18位,建议还是用sequence。

因为sys_guid()有字母,而我只要纯数字。

#6


你可以做个字母到数字的对换。。。