如何从oracle生成大写和小写的字母数字随机字符串?
我曾经习惯select DBMS_RANDOM.STRING('x', 10) from dual生成大写字母数字字符
并select DBMS_RANDOM.STRING('a', 10) from dual生成大写和小写字母字符
...但我想要一个同时执行大写和小写,以及字母和数字字符的函数.
另外,如果你能想出甲骨文没有实现这一点的充分理由,还可以获得奖励积分(或仅仅是赞成票)?
Ale*_*ole 10
你可以自己动手.这是一个选择:
create or replace function random_str(v_length number) return varchar2 is
my_str varchar2(4000);
begin
for i in 1..v_length loop
my_str := my_str || dbms_random.string(
case when dbms_random.value(0, 1) < 0.5 then 'l' else 'x' end, 1);
end loop;
return my_str;
end;
/
select random_str(30) from dual;
RANDOM_STR(30)
--------------------------------------------------------------------------------
pAAHjlh49oZ2xuRqVatd0m1Pv8XuGs
Run Code Online (Sandbox Code Playgroud)
您可能需要调整0.5以考虑不同的池大小 - 26对于l36对x.(.419354839?).您还可以使用value()并传入字符值的开始和结束范围,但这将是特定于字符集的.
至于为什么...... Oracle需要一个理由吗?使用x可能表明它最初是十六进制的并且被扩展为包括所有大写,而没有它们同时添加混合大小写版本.
试试这个,
with
r as (
select
level lvl,
substr(
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
mod(abs(dbms_random.random), 62)+1, 1) a
from dual connect by level <= 10
)
select
replace(sys_connect_by_path(a, '/'), '/') random_string
from r
where lvl = 1
start with lvl = 10
connect by lvl + 1 = prior lvl
;
Run Code Online (Sandbox Code Playgroud)
输出,
FOps2k0Pcy
Run Code Online (Sandbox Code Playgroud)