如何从oracle生成大写和小写的字母数字随机字符串?
我使用select DBMS_RANDOM.STRING('x', 10) from dual
生成大写字母数字字符
和select DBMS_RANDOM.STRING('a', 10) from dual
生成大写和小写字母字符
...但我想要一个同时执行大写和小写以及字母和数字字符的函数。
此外,如果你能想出甲骨文没有实现这个原因的充分理由,还可以获得奖励积分(或仅仅是赞成票)?
答案 0 :(得分: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
您可能需要调整0.5
以考虑不同的游泳池尺寸 - l
为26而x
为36。 (.419354839?
)。您也可以使用value()并传入字符值的开始和结束范围,但这将是特定于字符集的。
至于为什么...... Oracle需要一个理由吗? x
的使用可能表明它最初是十六进制的,并且扩展为包括所有大写字母,而不会发生它们同时添加混合大小写版本。
答案 1 :(得分:9)
试试这个,
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
;
输出,
FOps2k0Pcy
答案 2 :(得分:3)
CREATE OR REPLACE FUNCTION fn_mac RETURN varchar2 IS
w number :=0;
a varchar2(10);
b varchar2(50);
x number :=0;
y number :=0;
z number :=0;
c varchar2(50);
result varchar2(20);
BEGIN
select round(dbms_random.value(1,99))into w from dual;
SELECT upper(dbms_random.string('A', 2))into a FROM dual;
SELECT round(dbms_random.value(1, 9)) into x FROM dual;
SELECT upper(dbms_random.string('A', 4)) into b FROM dual;
SELECT round(dbms_random.value(1, 9)) into y FROM dual;
SELECT upper(dbms_random.string('A', 1)) into c FROM dual;
SELECT round(dbms_random.value(1, 9)) into z FROM dual;
result :=( to_char(w) ||a|| to_char(x)|| b|| to_char(y)|| c ||to_char(z)) ;
DBMS_OUTPUT.PUT_LINE( 'Result ::' || result);
RETURN result ;
END fn_mac;
/
答案 3 :(得分:1)
这个怎么样:
select translate(dbms_random.string('a', 20), 'abcXYZ', '158249') from dual;
或者,甚至更随机;)
select translate(dbms_random.string('a', 20), dbms_random.string('a',6), trunc(dbms_random.value(100000,999999))) from dual;
答案 4 :(得分:1)
您可以从Printable选项开始,然后删除任何非字母数字:
select SUBSTR(
TRANSLATE(dbms_random.string('p',100)
,'A`~!@#$%^&*()-=_+[]\{}|;'':",./<>?'
,'A')
,1,10) from dual;
(注意:很少,这将返回少于10个字符)
或者,将有问题的字符映射到其他字母和数字(尽管这会减少随机性):
select TRANSLATE(dbms_random.string('p',10)
,'A`~!@#$%^&*()-=_+[]\{}|;'':",./<>? '
,'A' || dbms_random.string('x',33)) from dual;
顺便说一句,这是个好问题。
现在,我的奖励积分:
Oracle没有实现这一点的原因是因为没有人要求它,它可能不是一个高优先级。
答案 5 :(得分:0)
create or replace procedure r1
is
v_1 varchar2(1);
v_2 varchar2(10);
begin
for inner_c in 1..10
loop
select substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',mod(abs(dbms_random.random), 62)+1, 1) into v_1 from dual;
v_2 := v_2 || v_1;
end loop;
dbms_output.put_line(v_2);
end;
/