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
'programing' 카테고리의 다른 글
Oracle에 기본 키에 대한 자동 증분 기능이 없는 이유는 무엇입니까? (0) | 2023.07.20 |
---|---|
JDBC for Oracle을 사용하여 ResultSet을 반복하는 데 16초 정도의 많은 시간이 소요됩니까? (0) | 2023.07.20 |
SQL Server Int 또는 BigInt 데이터베이스 테이블 ID (0) | 2023.07.20 |
어떻게 두 세트를 추가합니까? (0) | 2023.07.20 |
Android 전화기 모델을 프로그래밍 방식으로 가져오기, Android에서 장치 이름과 모델을 프로그래밍 방식으로 가져오는 방법은 무엇입니까? (0) | 2023.07.20 |