Oracle儲存過程生成大量不重複的隨機數

2021-08-26 13:24:16 字數 1912 閱讀 1089

存放隨機數的表結構:

create table coupon_code

(id number(22),--主鍵

code varchar2(10),--隨機數

used varchar2(2)--是否使用標識

)需求說明:生成1億條隨機數存放到code欄位,欄位id為主鍵,取值從1到1億,要求code值為從1到1億之間的隨機數,且不能重複,code欄位型別為字元,長度都固定為8位,不足的在左邊補0.

實現思路:每次插入一條資料,id值和code值相同,同時計數器加1,再從已經插入的資料中取出乙個隨機id,查出這個id對應的code值,將最新插入的記錄的code值與隨機取得的記錄的code值互換。

測試結果:生成1w條隨機數用時159s

儲存過程**:

create or replace procedure insert_random_couponcode(maxnum in number) is

currentid number(9);

randomid number(9);

randomcode varchar2(9);

currentcode varchar2(9);

querysql varchar2(2000);

updatesql varchar2(2000);

type c_mycur is ref cursor;

c_cur c_mycur;

begin

select max(id) into currentid from coupon_code;

if(currentid is null)then

insert into coupon_code(id,code)values(1,'00000001');

commit;

currentid:=1;

end if;

open c_cur for 'select t.id,t.code from coupon_code t';

loop

currentid:=currentid+1;

currentcode:=trim(to_char(currentid,'09999999'));

querysql:='select abs(mod(dbms_random.random,'||currentid||')) from dual';

execute immediate querysql into randomid;

if randomid=0 then

randomid:=1;

end if;

querysql:='select t.code from coupon_code t where t.id='||randomid;

execute immediate querysql into randomcode;

updatesql:='begin insert into coupon_code(id,code)values('||currentid||','''||randomcode||''')'||

';update coupon_code set code='''||currentcode||''' where id='||randomid||';end;';

execute immediate updatesql;

commit;

exit when currentid=maxnum;

end loop;

close c_cur;

dbms_output.put_line('finished !');

exception

when others then

rollback;

dbms_output.put_line('exception!!!');

end insert_random_couponcode;

oracle索引 快速生成大量測試資料

1.建立索引 create index on tablespace 2.刪除索引 drop index3.重置索引 alter index rebuild4.索引特點第一,通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。第二,可以大大加快資料的檢索速度,這也是建立索引的最主要的原因。第三,...

oracle儲存過程刪除大量資料

create or replace procedure delbigtab p tablename in varchar2,p condition in varchar2,p count in varchar2 as pragma autonomous transaction n delete nu...

Oracle 資料庫SQL語句生成大量測試資料。

做資料庫開發或管理的人經常要建立大量的測試資料,動不動就需要上萬條,如果一條一條的錄入,那會浪費大量的時間,本文介紹了oracle中如何通過一條sql快速生成大量的測試資料的方法。產生測試資料的sql如下 sql select rownum as id,2 to char sysdate rownu...