写了个存储过程部分如下: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位?
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位?
v_id := '000000000000' || to_char(SYSDATE, 'yyyymmddhh24miss') || lpad(to_char(v_num), 4, '0');或者使用序列sequence来生成ID保证唯一性。
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);
或者用序列加触发器