写了个存储过程部分如下: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位?

解决方案 »

  1.   

    随机数不能保证不重复,即然你已经使用循环了,使用v_num来拼接不就行了
    v_id  := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');或者使用序列sequence来生成ID保证唯一性。
      

  2.   


    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.   

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