Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle:Konvertieren Sie den Währungsbetrag in Wörtern mit PL/SQL

Unten gebe ich ein Beispiel für eine gespeicherte Oracle-Funktion zum Konvertieren von Währungsbeträgen in Wörtern mit PL/SQL. Zum Beispiel würde der Betrag von 123,45 $ als einhundertdreiundzwanzig Dollar und fünfundvierzig Cent übersetzt. Außerdem können Sie die Währung in Funktion ändern, z. B. Rupien und Paise.

Oracle PL/SQL-Funktion zum Konvertieren des Währungsbetrags in Wörtern

Die folgende gespeicherte Oracle PL/SQL-Funktion akzeptiert ein numerisches Argument und hat keine Einschränkungen. Eine Zahl kann eine Dezimalzahl, eine ganze Zahl und eine negative Zahl sein. Die Funktion amount_in_words hat eine Funktion innerhalb von check_if_single , und die check_if_single-Funktion hat ein n_spell Funktion im Inneren, um den Währungsbetrag in Wörter umzuwandeln. Ich dachte daran, ein Paket anstelle dieser Funktion zu erstellen, aber ich dachte, dass nur eine Funktion einfacher zu warten wäre.

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;

Ausgabe

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

Durch eine Tabelle testen

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

Ausgabe

CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849,98 Achtundsiebzigtausendachthundertneunundvierzig Dollar und achtundneunzig Cent
77493 7738829.15 Sieben Millionen Siebenhundertachtunddreißigtausendachthundertneunundzwanzig Dollar und fünfzehn Cent
88399 99836662388,98 Neunundneunzig Milliarden Achthundertsechsunddreißig Millionen Sechshundertzweiundsechzigtausenddreihundertachtundachtzig Dollar und achtundneunzig Cent
97737 -88993.5 Minus achtundachtzigtausendneunhundertdreiundneunzig Dollar und fünfzig Cent
88948 998349 Neunhundertachtundneunzigtausenddreihundertneunundvierzig Dollar

Beim Aufruf von check_if_single können Sie die Währung ändern Funktion von amount_in_words Funktion. Zum Beispiel habe ich im folgenden Teil des PL/SQL-Codes zu Rupees and Paise geändert:

 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;

Nach der Änderung testen

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Ausgabe

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

Möglicherweise müssen Sie das Wort Rupees von der End- zur Startposition der Zeile verschieben, abhängig von Ihrem Währungsformat und das kann in der obigen Funktion einfach geändert werden.

Siehe auch:

  • Hilfsprogramm:Generieren Sie eine PL/SQL-Prozedur zum Exportieren von Daten aus einer Tabelle in 2 Minuten