【问题标题】:Converting integer value from a db column to text in oracle将整数值从 db 列转换为 oracle 中的文本
【发布时间】:2013-05-07 02:04:30
【问题描述】:

我在 db 中有一个需求。

1). 表 ABC,列:check_amount number number(18,4)。这基本上包含例如支票金额。 3000.50 支付给员工。

现在开出一张支票,该支票包含这个 check_amount 的数量和文本形式。例如,支票将有:

pay to <emplyee_name> ****$3000.50**** ****THREE THOUSAND DOLLARS AND FIFTY CENTS****

我必须使用 DB 列值生成此文本并在检查时显示。

谁能帮帮我,我如何在 oracle 11g 中实现这一点?

提示:我听说过 Julien 格式,但那行不通。非常感谢任何建议。

从 纳林

【问题讨论】:

    标签: oracle oracle11g oracle10g oracle9i


    【解决方案1】:

    由于 Julian 格式仅适用于整数,您可以分隔小数部分,然后将 Julian 格式技巧应用于分隔的数字。这是一个简单的演示。

    DECLARE
       x   NUMBER (8, 2) := 1253.5;
       y   NUMBER;
       z   NUMBER;
    BEGIN
       y := FLOOR (x);
       z := 100 * (x - y);
       DBMS_OUTPUT.put_line (TO_CHAR (TO_DATE (y, 'j'), 'jsp'));
    
       IF (z > 0)
       THEN
          DBMS_OUTPUT.put_line (TO_CHAR (TO_DATE (z, 'j'), 'jsp'));
       END IF;
    EXCEPTION
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line ('err:' || SQLERRM);
    END;
    

    【讨论】:

    • @noel: 使用儒略日期有一个限制,它的范围是从 1 到 5373484。这就是为什么如果你把值放在 5373484 之后,它会抛出一个错误,如下所示:ORA-01854: julian date must be between 1 and 5373484 ,如问题中所述,数字可以有18位数字,那么这种情况是可能的
    【解决方案2】:

    使用Julian dates有一个限制,范围为1 to 5373484。这就是为什么如果你把值放在5373484 之后,它会抛出一个错误,如下所示:

    ORA-01854: julian date must be between 1 and 5373484
    

    为了解决上述问题,创建一个函数,并用 j->jsp 的小技巧,你可以得到想要的结果。

    CREATE OR REPLACE FUNCTION spell_number (p_number IN NUMBER)
       RETURN VARCHAR2
    AS
       TYPE myArray IS TABLE OF VARCHAR2 (255);
       v_decimal     PLS_INTEGER;
    
       l_str myArray
         := myArray ('',
                     ' thousand ',
                     ' million ',
                     ' billion ',
                     ' trillion ',
                     ' quadrillion ',
                     ' quintillion ',
                     ' sextillion ',
                     ' septillion ',
                     ' octillion ',
                     ' nonillion ',
                     ' decillion ',
                     ' undecillion ',
                     ' duodecillion ');
    
       l_num      VARCHAR2 (50) DEFAULT TRUNC (p_number);
       l_return   VARCHAR2 (4000);
    BEGIN
      FOR i IN 1 .. l_str.COUNT
       LOOP
         EXIT WHEN l_num IS NULL;
    
          IF (SUBSTR (l_num, LENGTH (l_num) - 2, 3) <> 0)
          THEN
             l_return :=
                TO_CHAR (TO_DATE (SUBSTR (l_num, LENGTH (l_num) - 2, 3), 'J'),
                         'Jsp')
                 || l_str (i)
                 || l_return;
          END IF;
    
         l_num := SUBSTR (l_num, 1, LENGTH (l_num) - 3);
       END LOOP;
    
       v_decimal := 100* (p_number -TRUNC(p_number)) ;
    
       IF v_decimal>0 THEN 
    
           RETURN l_return ||' Dollars AND '||TO_CHAR (TO_DATE (v_decimal, 'j'), 'jsp')|| ' Cents';        
    
    
      ELSE
    
       RETURN l_return ||' Dollars' ;
      END IF;
    
    END;
    /
    
    select  spell_number(122344343444444.23) from dual;
    

    输出:

    122 万亿 34440 亿 344300 444444444 美元和 23 美分 Blog Link

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多