将数字转换为单词的函数 PL/SQL
A Function that converts a number into words PL/SQL
在我的包中,我正在尝试编写一个 PL/SQL 将数字转换为单词的函数。
我的函数:
FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(34);
BEGIN
f_numbertoword := ( <-- Here the 'Statement Ignored' error is raised
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(pn_number), <-- Here the PLS-00306 error is raised
'0','zero '),
'1','one '),
'2','two '),
'3','three '),
'4','four '),
'5','five '),
'6','six '),
'7','seven '),
'8','eight '),
'9','nine ');
RETURN f_numbertoword;
END;
这为我提供了以下错误:
Error: PL/SQL: Statement ignored
Error: PLS-00306: wrong number or types of arguments in call to
'REPLACE'
我不知道如何解决这些错误,或者您是否建议使用更好、更美观的函数样式来实现相同的结果。例如
f_numbertoword(123);
Returns:
'one two three'
谢谢
或者你也可以使用这种方式:
CREATE OR REPLACE FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(500):= null;
v_len number;
v_num number;
v_name varchar2(100);
BEGIN
v_len:= length(pn_number);
for i in 1..v_len
loop
v_num := substr(pn_number,i,1);
--dbms_output.put_line(v_num);
v_name := case when (v_num = 0) THEN
'zero'
when (v_num = 1) THEN
'one'
when (v_num = 2) THEN
'two'
when (v_num = 3) THEN
'three'
when (v_num = 4) THEN
'four'
when (v_num = 5) THEN
'five'
when (v_num = 6) THEN
'six'
when (v_num = 7) THEN
'seven'
when (v_num = 8) THEN
'eight'
when (v_num = 9) THEN
'nine'
end;
f_numbertoword:=f_numbertoword||' '|| v_name;
end loop;
RETURN f_numbertoword;
END;
输出
SQL> select f_numbertoword(9) from dual;
F_NUMBERTOWORD(123)
--------------------------------------------------------------------------------
one two three
该错误消息是不言自明的。根据 documentation,REPLACE
函数接受两个或三个参数。在出现 PLS-00306 错误的那一行,您正在用一个参数调用它。
REPLACE和括号的嵌套无效。像这样修复它:
FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(34);
BEGIN
f_numbertoword := REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(pn_number,
'0','zero '),
'1','one '),
'2','two '),
'3','three '),
'4','four '),
'5','five '),
'6','six '),
'7','seven '),
'8','eight '),
'9','nine ');
RETURN f_numbertoword;
END;
在我的包中,我正在尝试编写一个 PL/SQL 将数字转换为单词的函数。
我的函数:
FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(34);
BEGIN
f_numbertoword := ( <-- Here the 'Statement Ignored' error is raised
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(pn_number), <-- Here the PLS-00306 error is raised
'0','zero '),
'1','one '),
'2','two '),
'3','three '),
'4','four '),
'5','five '),
'6','six '),
'7','seven '),
'8','eight '),
'9','nine ');
RETURN f_numbertoword;
END;
这为我提供了以下错误:
Error: PL/SQL: Statement ignored
Error: PLS-00306: wrong number or types of arguments in call to 'REPLACE'
我不知道如何解决这些错误,或者您是否建议使用更好、更美观的函数样式来实现相同的结果。例如
f_numbertoword(123);
Returns:
'one two three'
谢谢
或者你也可以使用这种方式:
CREATE OR REPLACE FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(500):= null;
v_len number;
v_num number;
v_name varchar2(100);
BEGIN
v_len:= length(pn_number);
for i in 1..v_len
loop
v_num := substr(pn_number,i,1);
--dbms_output.put_line(v_num);
v_name := case when (v_num = 0) THEN
'zero'
when (v_num = 1) THEN
'one'
when (v_num = 2) THEN
'two'
when (v_num = 3) THEN
'three'
when (v_num = 4) THEN
'four'
when (v_num = 5) THEN
'five'
when (v_num = 6) THEN
'six'
when (v_num = 7) THEN
'seven'
when (v_num = 8) THEN
'eight'
when (v_num = 9) THEN
'nine'
end;
f_numbertoword:=f_numbertoword||' '|| v_name;
end loop;
RETURN f_numbertoword;
END;
输出
SQL> select f_numbertoword(9) from dual;
F_NUMBERTOWORD(123)
--------------------------------------------------------------------------------
one two three
该错误消息是不言自明的。根据 documentation,REPLACE
函数接受两个或三个参数。在出现 PLS-00306 错误的那一行,您正在用一个参数调用它。
REPLACE和括号的嵌套无效。像这样修复它:
FUNCTION f_numbertoword(pn_number NUMBER) RETURN VARCHAR2 IS
f_numbertoword VARCHAR2(34);
BEGIN
f_numbertoword := REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(pn_number,
'0','zero '),
'1','one '),
'2','two '),
'3','three '),
'4','four '),
'5','five '),
'6','six '),
'7','seven '),
'8','eight '),
'9','nine ');
RETURN f_numbertoword;
END;