2013-05-13 59 views
2

我在db中有一个需求。将整数值从db列转换为oracle中的文本

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

现在检查所发布的支票包含该check_amount在数量,以及在文本form.for eg.check将有:

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

我使用DB列值生成该文本并显示在检查。

任何人都可以帮助我,我怎么能在oracle 11g中实现这一点?

提示:我听说过Julien格式,但那不行。任何建议,不胜感激。

从 纳林

回答

2

由于朱利安格式只适用于整数,也可以分开的小数部分,然后朱利安格式招应用到分隔的数字。这是一个简单的演示。

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; 
+0

感谢Noel..It正在为我工​​作...... – user2090701 2013-05-13 09:17:09

+1

@noel:使用Julian日期有一个限制,范围从1到5373484.这就是为什么如果你把值放在5373484之后,它会抛出你一个错误如下所示:'ORA-01854:朱利安日期必须在1之间和5373484',如问题所述,数字可以有18个数字,那么这种情况是可能的 – 2013-05-13 09:58:28

+0

@GauravSoni:oops ... – Noel 2013-05-13 10:03:42

1

有一个限制,而使用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; 

输出:

一百二十两万亿三四四十亿三百四十三亿元四百四十四个一千四百四十四美元和23美分Blog Link