sql >> Databasteknik >  >> RDS >> Oracle

Oracle:Konvertera valutabelopp i ord med PL/SQL

Nedan ger jag ett exempel på Oracle-lagrad funktion för att konvertera valutabelopp till ord med PL/SQL. Till exempel skulle beloppet 123,45 $ översättas till Hundra tjugotre dollar och fyrtiofem cent. Du kan också ändra valutan i funktion, till exempel Rupees och Paise.

Oracle PL/SQL-funktion för att konvertera valutabeloppet i ord

Följande Oracle PL/SQL-lagrade funktion accepterar ett numeriskt argument och har inga begränsningar. Ett tal kan vara ett decimaltal, ett heltal och ett negativt tal. Funktionen amount_in_words har en funktion i check_if_single , och check_if_single-funktionen har en n_spell funktion inuti för att konvertera valutabelopp till ord. Jag tänkte skapa ett paket istället för den här funktionen, men jag trodde att bara en funktion skulle vara lättare att underhålla.

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

Testa

SELECT amount_in_words (89378.58) FROM DUAL;

Utdata

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

Testa genom en tabell

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

Utdata

CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849.98 Sjuttioåtta tusen åttahundra fyrtionio dollar och nittioåtta cent
77493 7738829.15 Sju miljoner sju hundra trettioåtta tusen åtta hundra tjugonio dollar och femton cent
88399 99836662388.98 Nittio-nio miljarder åtta hundra trettiosex miljoner sex hundra sextiotvåtusen tre hundra åttioåtta dollar och nittioåtta cent
97737 -88993.5 Negativa åttioåtta tusen nio hundra nittiotre dollar och femtio cent
88948 998349 Niohundra nittioåtta tusen trehundra fyrtionio dollar

Du kan ändra valutan när du ringer check_if_single funktion från amount_in_words fungera. Till exempel ändrade jag till Rupees and Paise i följande del av PL/SQL-koden:

 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;

Testa efter att ha gjort ändringen

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Utdata

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

Kanske behöver du flytta ordet Rupees från radens slutposition till startpositionen beroende på ditt valutaformat och som enkelt kan ändras i ovanstående funktion.

Se även:

  • Verktyg:Generera PL/SQL-procedur för att exportera data från en tabell på 2 minuter
  1. Hur man distribuerar Chamilo MariaDB-databasen för hög tillgänglighet

  2. Hitta index för senaste förekomsten av en delsträng med T-SQL

  3. Kan inte uppdatera rad i Sqlite i Android men ger inget fel

  4. MySQL:ÄNDRA TABELL om kolumnen inte finns