plsql中的递归置换算法

plsql中的递归置换算法,sql,oracle,recursion,plsql,oracle-sqldeveloper,Sql,Oracle,Recursion,Plsql,Oracle Sqldeveloper,我正在尝试运行一个递归过程来置换给定的字符串。 它是在sqldeveloper上编译的,但当我尝试使用输入运行时,它在第13行(前缀分配)上给出了ora-06502:数字或值错误 有两个问题: 首先,LENGTH函数返回NULL如果其参数为NULL,而不是0,那么代码中的以下条件永远不会为真(因为strlen为NULL): 您得到的是ora-06502:numeric or value errors错误,因为当str参数为空时,FOR LOOP的范围上限为NULL(因为strlen为NULL):

我正在尝试运行一个递归过程来置换给定的字符串。 它是在sqldeveloper上编译的,但当我尝试使用输入运行时,它在第13行(前缀分配)上给出了ora-06502:数字或值错误


有两个问题:

首先,
LENGTH
函数返回
NULL
如果其参数为
NULL
,而不是0,那么代码中的以下条件永远不会为真(因为
strlen
NULL
):

您得到的是
ora-06502:numeric or value errors
错误,因为当
str
参数为空时,
FOR LOOP
的范围上限为
NULL
(因为
strlen
NULL
):

这就产生了:

ora-06502: numeric or value errors
其次,Oracle中
substr
函数的最后一个参数与Java中
String
substring
方法的含义不同。在Oracle中,该参数表示“应返回多少个字符”,而在Java中,它表示“从原始字符串返回的子字符串的结束索引”,因此应更改以下行:

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

必须进行更改,因为在提供链接的Java代码中,循环从0开始,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;
/
测试:

输出:

cat cta act atc tca tac 猫 cta 行为 空中交通管制 tca 交咨会


有两个问题:

首先,
LENGTH
函数返回
NULL
如果其参数为
NULL
,而不是0,那么代码中的以下条件永远不会为真(因为
strlen
NULL
):

您得到的是
ora-06502:numeric or value errors
错误,因为当
str
参数为空时,
FOR LOOP
的范围上限为
NULL
(因为
strlen
NULL
):

这就产生了:

ora-06502: numeric or value errors
其次,Oracle中
substr
函数的最后一个参数与Java中
String
substring
方法的含义不同。在Oracle中,该参数表示“应返回多少个字符”,而在Java中,它表示“从原始字符串返回的子字符串的结束索引”,因此应更改以下行:

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

必须进行更改,因为在提供链接的Java代码中,循环从0开始,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;
/
测试:

输出:

cat cta act atc tca tac 猫 cta 行为 空中交通管制 tca 交咨会


您使用什么作为输入值?算法错误。您正在将字符添加到
前缀
,直到在一个递归调用中它最终超过30个字符,并且您得到了错误。算法应该如何工作?你有什么描述吗?@bobjarvisprint_anagrams(“'cat')@PrzemyslawKruglej其翻译自。Perm1您使用什么作为输入值?算法错误。您正在将字符添加到
前缀
,直到在一个递归调用中它最终超过30个字符,并且您得到了错误。算法应该如何工作?你有什么描述吗?@bobjarvisprint_anagrams(“'cat')@PrzemyslawKruglej其翻译自。perm1 cat cta act atc tca tac