4

O、o、0 などの文字を避けたいので、PL/SQL を使用して文字を制限してランダム文字列を生成しようとしています。しかし、私たちの環境ではこれを使用しているため、Oracle 9i を使用してこれを実現したいと考えています。任意の提案をいただければ幸いです。

4

4 に答える 4

3

DBMS_RANDOMパッケージを使用して、ランダムな文字列を生成してみてください。

例 :dbms_random.string('x',10)長さ 10 の大文字の英数字文字列を返します。

ただし、特定の文字を除外することはできません。TRANSLATEまたは関数を使用REPLACEして、不要な文字を削除する必要があります。

于 2013-06-05T07:40:01.087 に答える
2

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

SQL フィドル

内部選択は、値の文字列内の各文字をランダムな順序に入れています。次のレベルではfirst_value()andを使用しdistinctて、大文字と小文字のペア ( a/ A) のうち最初に見つかった方を選択するため、大文字と小文字を無視しても繰り返しが発生しません。その後、最初の 10、11、または 12 (個別) 行に制限されます。最後に、同じxmlagg呼び出しを使用して、これらの行を 1 つの文字列に変換します。

于 2013-06-05T11:05:46.223 に答える
2

listaggアプローチの 1 つは、関数の動作を模倣するユーザー定義の集計関数を作成することです。次に例を示します。

  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 を使用できますvarchar2str_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
于 2013-06-05T07:30:56.027 に答える