По-долу давам пример за съхранена функция на Oracle за преобразуване на сумата на валута в думи с помощта на PL/SQL. Например сумата от $123,45 би се превела като Сто двадесет и три долара и четиридесет и пет цента. Освен това можете да промените валутата във функция, например рупии и пайзи.
Oracle PL/SQL функция за преобразуване на валутната сума в думи
Следната съхранена функция на Oracle PL/SQL приема числов аргумент и няма ограничения. Числото може да бъде десетично, цяло и отрицателно число. Функцията количество_в_думи има функция вътре в check_if_single , а функцията check_if_single има n_spell функция вътре за преобразуване на валутната сума с думи. Мислех да създам пакет вместо тази функция, но реших, че само функция ще бъде по-лесна за поддръжка.
CREATE OR REPLACE FUNCTION amount_in_words (i_amt IN NUMBER) RETURN VARCHAR2 IS n_dollar NUMBER; n_cents NUMBER; FUNCTION check_if_single (i_num IN NUMBER, currency IN VARCHAR2) RETURN VARCHAR2 IS FUNCTION n_spell (i_num IN NUMBER) RETURN VARCHAR2 AS TYPE w_Array IS TABLE OF VARCHAR2 (255); l_str w_array := w_array ('', ' thousand ', ' million ', ' billion ', ' trillion ', ' quadrillion ', ' quintillion ', ' sextillion ', ' septillion ', ' octillion ', ' nonillion ', ' decillion ', ' undecillion ', ' duodecillion '); l_num VARCHAR2 (50) DEFAULT TRUNC (i_num); l_is_negative BOOLEAN := FALSE; l_return VARCHAR2 (4000); BEGIN IF SIGN (i_num) = -1 THEN l_is_negative := TRUE; l_num := TRUNC (ABS (i_num)); END IF; 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; IF NOT l_is_negative THEN RETURN INITCAP (l_return); ELSE RETURN 'Negative ' || INITCAP (l_return); END IF; END n_spell; BEGIN IF i_num = 1 THEN RETURN 'One ' || currency; ELSE RETURN n_spell (i_num) || ' ' || currency; END IF; END check_if_single; BEGIN IF i_amt IS NULL THEN RETURN ''; END IF; n_dollar := TRUNC (i_amt); n_cents := (ABS (i_amt) - TRUNC (ABS (i_amt))) * 100; IF NVL (n_cents, 0) > 0 THEN RETURN check_if_single (n_dollar, 'Dollar') || ' and ' || check_if_single (n_cents, 'Cents'); ELSE RETURN check_if_single (n_dollar, 'Dollar'); END IF; END amount_in_words; /
Тест
SELECT amount_in_words (89378.58) FROM DUAL;
Изход
Eighty-Nine Thousand Three Hundred Seventy-Eight Dollar and Fifty-Eight Cents
Тествайте чрез таблица
SELECT client_code, balance_amt, amount_in_words (balance_amt) balance_amount_in_words FROM account_balance;
Изход
CLIENT_CODE | BALANCE_AMT | BALANCE_AMOUNT_IN_WORDS |
---|---|---|
88499 | 78849,98 | Седемдесет и осем хиляди осемстотин четиридесет и девет долара и деветдесет и осем цента |
77493 | 7738829,15 | Седем милиона седемстотин тридесет и осем хиляди осемсто двадесет и девет долара и петнадесет цента |
88399 | 99836662388,98 | Деветдесет и девет милиарда осемстотин тридесет и шест милиона шестстотин шестдесет и две хиляди триста осемдесет и осем долара и деветдесет и осем цента |
97737 | -88993.5 | Отрицателно осемдесет и осем хиляди деветстотин деветдесет и три долара и петдесет цента |
88948 | 998349 | Деветстотин деветдесет и осем хиляди триста четиридесет и девет долара |
Можете да промените валутата, когато извикате check_if_single функция от amount_in_words функция. Например промених на Rupees и Paise в следната част от PL/SQL кода:
IF NVL (n_cents, 0) > 0 THEN RETURN check_if_single (n_dollar, 'Rupees') || ' and ' || check_if_single (n_cents, 'Paise'); ELSE RETURN check_if_single (n_dollar, 'Rupees'); END IF;
Тествайте след извършване на промяната
SELECT amount_in_words (7836.58) in_words FROM DUAL;
Изход
Seven Thousand Eight Hundred Thirty-Six Rupees and Fifty-Eight Paise
Може би трябва да преместите думата рупии от крайна към начална позиция на реда в зависимост от формата на вашата валута и която може лесно да се промени в горната функция.
Вижте също:
- Помощна програма:Генерирайте PL/SQL процедура за експортиране на данни от таблица за 2 минути