sql >> Base de Datos >  >> RDS >> Oracle

Oracle:Convierta la cantidad de moneda en palabras usando PL/SQL

A continuación, doy un ejemplo de la función almacenada de Oracle para convertir el monto de la moneda en palabras usando PL/SQL. Por ejemplo, la cantidad de $123,45 se traduciría como ciento veintitrés dólares y cuarenta y cinco centavos. Además, puede cambiar la moneda en función, por ejemplo, Rupias y Paise.

Función Oracle PL/SQL para convertir la cantidad de moneda en palabras

La siguiente función almacenada de Oracle PL/SQL acepta un argumento numérico y no tiene limitaciones. Un número puede ser un número decimal, entero y negativo. La función cantidad_en_palabras tiene una función dentro de check_if_single , y la función check_if_single tiene un n_spell función interior para convertir la cantidad de moneda en palabras. Estaba pensando en crear un paquete en lugar de esta función, pero pensé que solo una función sería más fácil de mantener.

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

Prueba

SELECT amount_in_words (89378.58) FROM DUAL;

Salida

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

Prueba a través de una tabla

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

Salida

CLIENT_CODE BALANCE_AMT SALDO_CANTIDAD_EN_PALABRAS
88499 78849.98 Setenta y ocho mil ochocientos cuarenta y nueve dólares con noventa y ocho centavos
77493 7738829.15 Siete Millones Setecientos Treinta y Ocho Mil Ochocientos Veintinueve Dólares y Quince Centavos
88399 99836662388.98 Noventa y nueve mil ochocientos treinta y seis millones seiscientos sesenta y dos mil trescientos ochenta y ocho dólares con noventa y ocho centavos
97737 -88993.5 Ochenta y ocho mil novecientos noventa y tres dólares con cincuenta centavos en negativo
88948 998349 Novecientos Noventa y Ocho Mil Trescientos Cuarenta y Nueve Dólares

Puede cambiar la moneda al llamar al check_if_single función de cantidad_en_palabras función. Por ejemplo, cambié a Rupees y Paise en la siguiente parte del código 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;

Prueba después de hacer el cambio

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Salida

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

Tal vez necesite cambiar la palabra Rupias del final a la posición inicial de la línea según el formato de su moneda y que se puede cambiar fácilmente en la función anterior.

Véase también:

  • Utilidad:Genere un procedimiento PL/SQL para exportar datos de una tabla en 2 minutos