plsql中的递归置换算法
我正在尝试运行一个递归过程来置换给定的字符串。 它是在sqldeveloper上编译的,但当我尝试使用输入运行时,它在第13行(前缀分配)上给出了ora-06502:数字或值错误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):
有两个问题: 首先,
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