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

在Oracle中生成大小写字母数字随机字符串,oracle,Oracle,如何从oracle生成大小写字母数字随机字符串 我使用SELECTDBMS_RANDOM.STRING'x',10 from dual生成大写字母数字字符 并从dual中选择DBMS_RANDOM.STRING'a',10以生成大写和小写字母字符 …但我想要一个同时包含大写和小写以及字母和数字字符的函数 另外,如果您能想出Oracle没有实施此功能的充分理由,您还可以获得额外积分或直接向上投票?试试这个 with r as ( select level lvl,

如何从oracle生成大小写字母数字随机字符串

我使用SELECTDBMS_RANDOM.STRING'x',10 from dual生成大写字母数字字符

并从dual中选择DBMS_RANDOM.STRING'a',10以生成大写和小写字母字符

…但我想要一个同时包含大写和小写以及字母和数字字符的函数

另外,如果您能想出Oracle没有实施此功能的充分理由,您还可以获得额外积分或直接向上投票?

试试这个

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
;

你可以做你自己的功能。这是一种选择:

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和pass,但这是特定于字符集的

至于为什么。。。甲骨文需要理由吗?使用x可能意味着它最初是十六进制的,并且扩展到包括所有大写字母,而不会同时添加混合大小写版本。

这是怎么回事:

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;

您可以从可打印选项开始,然后去掉任何非字母数字:

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之所以没有实现这一点,是因为没有人要求它,这可能不是一个高优先级问题。

我的解决方案表明,这可以在没有PL/SQL的情况下完成,但如果我不止一次预期需要这样一个随机字符串,我会使用PL/SQL函数,如@Alex Poole的回答所示。我认为这也可能与SQL优化相冲突,这可能会导致随机函数的调用更少每行不止一次。请参阅上的AskTom讨论。也许这可以通过为随机调用设定级别来防止。通过使用该级别来获取下一个要追加的字符,可以减少对dbms_random的调用数量,并避免在大小写表达式中选择阈值的需要:substr“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789”,modabsdbms_random.random,62+1,1@Janek我修改了Alex的代码以使用你的评论。很遗憾,我不能接受你的两个答案。因为甲骨文是懒惰的吗;upperdbms_random。字符串'A',2与dbms_random相同。字符串'U',2 pt种子值:'A','A'仅字母字符混合大小写'l','l'仅字母字符小写'p','p'任何可打印字符'U','U'仅大写字母字符'x','x'任何字母数字字符大写
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;
  /
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;
  /
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;
    /