2013-05-13 20 views
2

У меня есть требование в db.Преобразование целочисленного значения из столбца db в текст в оракуле

1) .Table ABC, column: 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****

Я должен создать этот текст, используя значение столбца БД и отобразите это при проверке.

Может кто-нибудь помочь мне, как я могу достичь этого в oracle 11g?

Подсказка: я слышал о формате Жюльена, но это не работает. Любые предложения приветствуются.

От Налина

ответ

2

Поскольку формат Джулиан работает только для целых чисел, то вы можете разделять десятичные части, а затем применить формат трюк 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; 
+0

Спасибо Noel..It работает для меня ... – user2090701

+1

@noel: существует ограничение при использовании юлианских дат, оно колеблется от 1 до 5373484. Вот почему, если вы поместите значения после 5373484, это бросит вас ошибка, как показано ниже: 'ORA-01854: дата julian должна быть между 1 и 5373484', как описано в вопросе, номер может содержать 18 цифр, тогда эта ситуация возможна –

+0

@GauravSoni: oops ... – Noel

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; 

Выход:

Сто двадцать два триллиона триста сорок четыре миллиарда триста сорок три миллиона четыреста сорок четыре тысячи четыреста сорок четыре доллара и двадцать три Cents Blog Link

Смежные вопросы