1

特定の文字列を並べ替える再帰的な手順を実行しようとしています。sqldeveloper でコンパイルしていますが、入力を使用して実行しようとすると、 ora-06502: 13 行目の数値または値のエラー (接頭辞の割り当て) が表示されます

create or replace 
  procedure print_anagrams
  (pre in varchar2, str in varchar2)
  is
    prefix varchar2(30);
    stringg varchar2(30);
    strlen number;
  begin
    strlen := length(str);
    if strlen = 0 then
     dbms_output.put_line(pre);
    else
      for i in 1..strlen loop
        prefix := pre || SUBSTR(str,i,1);
        stringg := SUBSTR(str,1,i) || SUBSTR(str,i+1,strlen);
        print_anagrams(prefix,stringg);
      end loop;
    end if;
  end;
4

1 に答える 1

5

次の 2 つの問題がありました。

まず、関数は、パラメーターが0 ではなく である場合にLENGTH戻ります。そのため、コード内の次の条件は真ではありませんでした ( がであるため)。NULLNULLstrlenNULL

if strlen = 0 then

引数が空の場合、 の上限が だっora-06502: numeric or value errorsたため、エラーが発生していました( が であるため) :strFOR LOOPNULLstrlenNULL

for i in 1..NULL loop

これにより、次の結果が得られます。

ora-06502: numeric or value errors

次に、Oracle の関数の最後のパラメーターは、 Javaのメソッドとsubstrは異なる意味を持ちます。Oracle では、このパラメーターは「返される文字数」を意味しますが、Java では「元の文字列から返される部分文字列の終了インデックス」を表すため、次の行を変更する必要があります。Stringsubstring

stringg := SUBSTR(str,1,i) || SUBSTR(str,i+1,strlen);

に:

stringg := SUBSTR(str,1,i - 1) || SUBSTR(str,i+1,strlen);

リンクを提供したJavaコードでは、ループが0から始まり、3番目の引数として0が渡されるため、ループの最初の繰り返しで空の文字列が返されるため、変更を加える必要がありました。変更がなければ、PL/SQL バージョンの最初の反復では、引数から最初の文字が返されます。

最後に、作業手順を取得します。

create or replace 
  procedure print_anagrams
  (pre in varchar2, str in varchar2)
  is
    prefix varchar2(30);
    stringg varchar2(30);
    strlen number;
  begin
    strlen := length(str);
    if NVL(strlen, 0) = 0 then
     dbms_output.put_line(pre);
    else
      for i in 1..strlen loop
        prefix := pre || SUBSTR(str,i,1);
        stringg := SUBSTR(str,1,i - 1) || SUBSTR(str,i+1,strlen);
        print_anagrams(prefix,stringg);
      end loop;
    end if;
  end;
/

テスト:

EXEC print_anagrams('', 'cat');

出力:

猫
cta
行為
atc
tca
タック

Oracle Substr 関数

Java String の substring メソッド

于 2013-11-13T02:11:06.783 に答える