在Oracle中生成大写和小写字母数字随机字符串

col*_*ebb 12 oracle

如何从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可能表明它最初是十六进制的并且被扩展为包括所有大写,而没有它们同时添加混合大小写版本.

  • 对dbms_random的调用次数将减少,并且可以通过使用它来获取要附加的下一个字符来避免在case表达式中选择阈值的需要:substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',mod(abs(dbms_random.random), 62)+ 1,1) (4认同)

Jan*_*cki 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
;
Run Code Online (Sandbox Code Playgroud)

输出,

FOps2k0Pcy
Run Code Online (Sandbox Code Playgroud)

  • 我认为这也可能与SQL优化相冲突,这可能导致随机函数每行调用少于一次.请参阅http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:3181424400346795479上的AskTom讨论.也许这可以通过使用级别播种随机调用来防止. (2认同)