Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle:Konwertuj wartość waluty w słowach za pomocą PL/SQL

Poniżej podaję przykład przechowywanej funkcji Oracle do przeliczania kwoty waluty na słowa przy użyciu PL/SQL. Na przykład kwota 123,45 USD zostałaby przeliczona jako sto dwadzieścia trzy dolary i czterdzieści pięć centów. Możesz także zmienić walutę w funkcji, na przykład Rupie i Paise.

Funkcja Oracle PL/SQL do konwersji wartości waluty na słowa

Następująca funkcja składowana Oracle PL/SQL akceptuje argument liczbowy i nie ma żadnych ograniczeń. Liczba może być liczbą dziesiętną, całkowitą i ujemną. Funkcja amount_in_words posiada funkcję wewnątrz check_if_single , a funkcja check_if_single ma n_spell funkcja wewnątrz, aby przeliczyć kwotę waluty w słowach. Myślałem o stworzeniu pakietu zamiast tej funkcji, ale pomyślałem, że łatwiej będzie utrzymać tylko funkcję.

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;

Wyjście

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

Przetestuj przez tabelę

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

Wyjście

CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849.98 siedemdziesiąt osiem tysięcy osiemset czterdzieści dziewięć dolarów i dziewięćdziesiąt osiem centów
77493 7738829.15 Siedem milionów siedemset trzydzieści osiem tysięcy osiemset dwadzieścia dziewięć dolarów i piętnaście centów
88399 9983666238.98 dziewięćdziesiąt dziewięć miliardów osiemset trzydzieści sześć milionów sześćset sześćdziesiąt dwa tysiące trzysta osiemdziesiąt osiem dolarów i dziewięćdziesiąt osiem centów
97737 -88993,5 ujemny osiemdziesiąt osiem tysięcy dziewięćset dziewięćdziesiąt trzy dolary i pięćdziesiąt centów
88948 998349 dziewięćset dziewięćdziesiąt osiem tysięcy trzysta czterdzieści dziewięć dolarów

Możesz zmienić walutę dzwoniąc pod numer check_if_single funkcja z amount_in_words funkcjonować. Na przykład zmieniłem na Rupees i Paise w następującej części kodu 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;

Test po wprowadzeniu zmiany

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Wyjście

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

Być może musisz przesunąć słowo Rupie z końca do początkowej pozycji linii w zależności od formatu waluty, który można łatwo zmienić w powyższej funkcji.

Zobacz też:

  • Narzędzie:generuj procedurę PL/SQL do eksportu danych z tabeli w 2 minuty
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:jak korzystać z UNION i zamawiać według konkretnego wyboru?

  2. oracle — Podziel wiele wartości oddzielonych przecinkami w tabeli Oracle na wiele wierszy

  3. Błąd logowania Sqlplus podczas używania zmiennych bash:SP2-0306:Nieprawidłowa opcja

  4. Odwołaj się do tabeli w innym schemacie, pomijając nazwę schematu

  5. Nie można przekazać wartości ciągu 1,2 jako danych wejściowych do zapytania wyroczni