将数字转换为单词的函数 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

该错误消息是不言自明的。根据 documentationREPLACE 函数接受两个或三个参数。在出现 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;