programing

Oracle에서 대문자 및 소문자 영숫자 임의 문자열 생성

goodsources 2023. 7. 20. 21:53
반응형

Oracle에서 대문자 및 소문자 영숫자 임의 문자열 생성

오라클에서 대문자와 소문자의 영숫자 랜덤 문자열을 생성하려면 어떻게 해야 합니까?

사용한 적이 있습니다.select DBMS_RANDOM.STRING('x', 10) from dual대문자 영숫자를 생성하다

그리고.select DBMS_RANDOM.STRING('a', 10) from dual알파벳 대문자와 소문자를 생성하다

...하지만 대문자와 소문자, 알파벳과 숫자를 모두 사용할 수 있는 기능을 원합니다.

또한 Oracle이 이를 구현하지 않은 좋은 이유를 생각할 수 있다면 보너스 포인트(또는 단지 업보)를 말씀해 주시겠습니까?

당신은 당신만의 기능을 만들 수 있습니다.이것은 한 가지 옵션입니다.

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다양한 수영장 크기를 고려하다 - 26l에 대한 대 36.x. (.419354839?. 문자 값의 시작 및 끝 범위에서 값()과 전달을 사용할 수도 있지만 문자 집합에 따라 다릅니다.

그 이유에 대해서는...Oracle은 이유가 필요합니까?의 사용x는 원래 16진수이며 대/소문자를 모두 포함하도록 확장되었지만 대/소문자가 혼합된 버전을 동시에 추가할 필요가 없음을 나타낼 수 있습니다.

이거 해봐요.

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

이거 어때:

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;
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;
  /

인쇄 가능 옵션으로 시작한 다음 영숫자가 아닌 모든 항목을 제거할 수 있습니다.

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이 이를 구현하지 않은 이유는 아무도 이를 요청하지 않았기 때문이며, 우선 순위가 높지 않을 수 있습니다.

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;
    /

언급URL : https://stackoverflow.com/questions/5549781/generate-upper-and-lowercase-alphanumeric-random-string-in-oracle

반응형