create or replace function GetRandStr
(
iLength number, --字符串的长度
isRepeat char --字符串是否可以重复:0--不可以;1--可以
) return varchar is
i number(10);
iRandom number(10);
sResult varchar2(100) := '';
seedMode varchar2(10) := '0123456789';
begin
if (iLength > 10 and isRepeat = '0')
then
return '';
end if;
if (isRepeat = '1')
then
--方法一: 利用系统中dbms_random.value 产生(只支持到38位)
--sResult := substr(dbms_random.value,3,iLength);
--方法二:
for i in 1 .. iLength
loop
iRandom := trunc(dbms_random.value(1, lengthb(seedMode) + 1));
sResult := sResult || substr(seedMode, iRandom, 1);
end loop;
end if;
if (isRepeat = '0')
then
for i in 1 .. iLength
loop
--产生随机数,用于获取seedMode字符串的随机位置
iRandom := trunc(dbms_random.value(1, lengthb(seedMode) + 1));
--获取该位置的字符,加入到sResult 结果中
sResult := sResult || substr(seedMode, iRandom, 1);
--将该位置中的字符从seedMode中删除
seedMode := substr(seedMode, 1, iRandom - 1) ||
substr(seedMode, iRandom + 1, lengthb(seedMode));
end loop;
end if;
return sResult;
end;
--测试
declare
str varchar2(40);
begin
--生成无重复的字符串
select GetRandStr(10,'0') into str from dual;
dbms_output.put_line(str);
--生成可以重复的字符串
select GetRandStr(10,'1') into str from dual;
dbms_output.put_line(str);
end;