- 您可以创建一个函数来返回此类随机密码并在查询中使用它:
-- function:
with
function get_rand_pass(n in number) return varchar2 as
res varchar2(15);
begin
loop
res:=DBMS_RANDOM.STRING('p',15);
exit when
regexp_like(res,'[^a-zA-Z0-9]') -- special char
and regexp_like(res,'\d') -- at least one number
and regexp_like(res,'[A-Z]') -- at least one UPPER letter
;
end loop;
return res;
end;
-- end of function
-- test query:
select
get_rand_pass(dbms_random.value()) pass
from dual;
完整示例:
with
function get_rand_pass(n in number) return varchar2 as
res varchar2(15);
begin
loop
res:=DBMS_RANDOM.STRING('p',15);
exit when
regexp_like(res,'[^a-zA-Z0-9]') -- special char
and regexp_like(res,'\d') -- at least one number
and regexp_like(res,'[A-Z]') -- at least one UPPER letter
;
end loop;
return res;
end;
select
get_rand_pass(dbms_random.value()) pass
from dual
connect by level<=10
/
PASS
---------------
C7Bncs'bH9+Hx&p
kHG<&4Aw36VS3W
np xvyvM]3In #{
%A1&+}XVNyBvL'%
+,Bp hII\q,&7>V
h@l` kE(b4=-C</
(c{7"`~UvN44#e/
<_s+4G!nlujcytJ
{[a2{*sXW;;$#<.
7)^>Qj4!1MTm?};
10 rows selected.
- 或在您的查询中使用以下子查询:
(
select pass
from
(select DBMS_RANDOM.STRING('p',15) pass from dual connect by level<=1e5)
where
rownum=1 -- first pass
and regexp_like(pass,'[^a-zA-Z0-9]') -- special char
and regexp_like(pass,'\d') -- at least one number
and regexp_like(pass,'[A-Z]') -- at least one UPPER letter
) pass
但它可能会被缓存(scalar subquery caching),如果你使用这种生成器的交叉连接,它可能在hash join中只执行一次,所以它需要一个解决方法,例如:
select--+ use_nl(pass_gen)
*
from FND_ORACLE_USERID,
lateral(
select--+ no_merge no_unnest
pass
from
(select DBMS_RANDOM.STRING('p',15) pass from dual connect by level<=1e5)
where
rownum=1 -- first pass
and regexp_like(pass,'[^a-zA-Z0-9]') -- special char
and regexp_like(pass,'\d') -- at least one number
and regexp_like(pass,'[A-Z]') -- at least one UPPER letter
) pass_gen;
正如您在此处看到的,我强制 nested loops 并禁用合并和取消嵌套转换。