sql >> Databáze >  >> RDS >> Oracle

Oracle:Převod částky měny ve slovech pomocí PL/SQL

Níže uvádím příklad uložené funkce Oracle pro převod částky měny na slova pomocí PL/SQL. Například částka 123,45 $ by se přeložila jako Sto dvacet tři dolarů a čtyřicet pět centů. Můžete také změnit měnu ve funkci, například rupie a paise.

Funkce Oracle PL/SQL pro převod částky měny ve slovech

Následující uložená funkce Oracle PL/SQL přijímá číselný argument a nemá žádná omezení. Číslo může být desetinné, celé nebo záporné číslo. Funkce množství_ve_slovech má funkci uvnitř check_if_single a funkce check_if_single má n_spell funkce uvnitř pro převod částky měny na slova. Přemýšlel jsem o vytvoření balíčku namísto této funkce, ale myslel jsem si, že pouze funkce bude jednodušší na údržbu.

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;
/

Test

SELECT amount_in_words (89378.58) FROM DUAL;

Výstup

Eighty-Nine Thousand Three Hundred Seventy-Eight Dollar and Fifty-Eight Cents

Otestujte pomocí tabulky

SELECT client_code,
       balance_amt,
       amount_in_words (balance_amt) balance_amount_in_words
  FROM account_balance;

Výstup

KÓD KLIENTA BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849,98 Sedmdesát osm tisíc osm set čtyřicet devět dolarů a devadesát osm centů
77493 7738829.15 Sedm milionů sedm set třicet osm tisíc osm set dvacet devět dolarů a patnáct centů
88399 99836662388.98 Devadesát devět miliard osm set třicet šest milionů šest set šedesát dva tisíce tři sta osmdesát osm dolarů a devadesát osm centů
97737 -88993.5 Záporné číslo osmdesát osm tisíc devět set devadesát tři dolarů a padesát centů
88948 998349 Devět set devadesát osm tisíc tři sta čtyřicet devět dolarů

Měnu můžete změnit při volání check_if_single funkce z množství_ve_slovech funkce. Například jsem se v následující části kódu PL/SQL změnil na rupie a paise:

 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;

Po provedení změny otestujte

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Výstup

Seven Thousand Eight Hundred Thirty-Six Rupees and Fifty-Eight Paise

Možná budete muset posunout slovo rupie z konce na počáteční pozici řádku v závislosti na formátu vaší měny, který lze snadno změnit ve výše uvedené funkci.

Viz také:

  • Nástroj:Vygenerujte proceduru PL/SQL pro export dat z tabulky za 2 minuty
  1. Funkce CHARTOROWID() v Oracle

  2. Jak nastavit název tabulky v dynamickém SQL dotazu?

  3. Těžební plány :Nejen pro mezipaměť plánů

  4. 3 způsoby, jak získat jazyk aktuální relace na serveru SQL (T-SQL)