O、o、0 などの文字を避けたいので、PL/SQL を使用して文字を制限してランダム文字列を生成しようとしています。しかし、私たちの環境ではこれを使用しているため、Oracle 9i を使用してこれを実現したいと考えています。任意の提案をいただければ幸いです。
4 に答える
DBMS_RANDOMパッケージを使用して、ランダムな文字列を生成してみてください。
例 :dbms_random.string('x',10)
長さ 10 の大文字の英数字文字列を返します。
ただし、特定の文字を除外することはできません。TRANSLATE
または関数を使用REPLACE
して、不要な文字を削除する必要があります。
ABCadeの答えを盗む(コメントを残すには、オリジナルから少し離れすぎています):
select xmlagg(xmlelement("r", ch)).extract('//text()').getstringval()
from
(
select distinct first_value(ch) over (partition by lower(ch)) as ch
from (
select substr('abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789',
level, 1) as ch
from dual
connect by level <= 59
order by dbms_random.value
)
where rownum <= dbms_random.value(10,13)
);
内部選択は、値の文字列内の各文字をランダムな順序に入れています。次のレベルではfirst_value()
andを使用しdistinct
て、大文字と小文字のペア ( a
/ A
) のうち最初に見つかった方を選択するため、大文字と小文字を無視しても繰り返しが発生しません。その後、最初の 10、11、または 12 (個別) 行に制限されます。最後に、同じxmlagg
呼び出しを使用して、これらの行を 1 つの文字列に変換します。
listagg
アプローチの 1 つは、関数の動作を模倣するユーザー定義の集計関数を作成することです。次に例を示します。
ユーザー定義の集計関数:
SQL> create or replace type stragg as object ( 2 3 str varchar2(4000), 4 5 static function ODCIAggregateInitialize(sctx in out stragg) 6 return number, 7 8 member function ODCIAggregateIterate (self in out stragg, 9 value in varchar2 ) 10 return number, 11 12 member function ODCIAggregateTerminate (self in stragg , 13 return_value out varchar2, 14 flags in number ) 15 return number, 16 17 member function ODCIAggregateMerge(self in out stragg, 18 ctx2 in stragg ) 19 return number 20 ) 21 / Type created SQL> create or replace type body stragg is 2 3 static function ODCIAggregateInitialize(sctx in out stragg) 4 return number is 5 begin 6 sctx := stragg(null); 7 return ODCIConst.Success; 8 end; 9 10 member function ODCIAggregateIterate( 11 self in out stragg, value in varchar2) 12 return number is 13 begin 14 str := str || value; 15 return ODCIConst.Success; 16 end; 17 18 member function ODCIAggregateTerminate(self in stragg, 19 return_value out varchar2, flags in number) return number is 20 begin 21 return_value := str; 22 return ODCIConst.Success; 23 end; 24 25 member function ODCIAggregateMerge(self in out stragg, 26 ctx2 in stragg) return number is 27 begin 28 str := str || ctx2.str; 29 return ODCIConst.Success; 30 end; 31 end; 32 / Type body created SQL> create or replace function str_agg (input varchar2) return varchar2 2 parallel_enable aggregate using stragg; 3 / Function created
長さが 4000 を超える文字列を扱う場合は、CLOB
代わりに datatype を使用できますvarchar2
。str_agg
これで、その集計関数を使用してランダムな文字列を生成する追加の関数を作成できます。結果の文字列から一部の文字を除外したいので、目的の文字列が生成される文字のセットを提供する方がよいと思います。
SQL> create or replace function Str_gen(p_CharSet varchar2, p_length number)
2 return varchar2
3 is
4 l_res_str varchar2(4000);
5 begin
6 select str_agg(symbol)
7 into l_res_str
8 from ( select substr(p_CharSet,
9 dbms_random.value(1, length(p_charset)), 1) as symbol
10 from dual
11 connect by level <= p_length
12 order by dbms_random.value
13 );
14
15 return l_res_str;
16 end;
17 /
Function created
そして、これがどのように機能するかです:
SQL> select str_gen('abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789',11) as res
2 from dual
3 connect by level <= 11
4 /
RES
--------------------------------------------------------------------------------
NBG5jK6G46G
fSrzmyq7ZLE
vdGE1dRXlah
1D2IsI54qzD
PhktBAh5rXu
JtRsarxFNiV
1sUGFpwmypQ
7giwfdV4I7s
I2WMhKzxvc2
NZpngmrq1gM
rFuZ8gSUDgL
11 rows selected