次の 2 つの問題がありました。
まず、関数は、パラメーターが0 ではなく である場合にLENGTH
戻ります。そのため、コード内の次の条件は真ではありませんでした ( がであるため)。NULL
NULL
strlen
NULL
if strlen = 0 then
引数が空の場合、 の上限が だっora-06502: numeric or value errors
たため、エラーが発生していました( が であるため) :str
FOR LOOP
NULL
strlen
NULL
for i in 1..NULL loop
これにより、次の結果が得られます。
ora-06502: numeric or value errors
次に、Oracle の関数の最後のパラメーターは、 Javaのメソッドとsubstr
は異なる意味を持ちます。Oracle では、このパラメーターは「返される文字数」を意味しますが、Java では「元の文字列から返される部分文字列の終了インデックス」を表すため、次の行を変更する必要があります。String
substring
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 メソッド