Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Oracle:Mengonversi Jumlah Mata Uang dalam Kata Menggunakan PL/SQL

Di bawah ini saya memberikan contoh fungsi tersimpan Oracle untuk mengonversi jumlah mata uang dalam kata-kata menggunakan PL/SQL. Misalnya, jumlah $123,45 akan diterjemahkan sebagai Seratus Dua Puluh Tiga Dolar dan Empat Puluh Lima Sen. Anda juga dapat mengubah mata uang dalam fungsi, misalnya, Rupee dan Paise.

Fungsi Oracle PL/SQL untuk Mengonversi Jumlah Mata Uang dalam Kata-kata

Fungsi tersimpan Oracle PL/SQL berikut menerima argumen numerik dan tidak memiliki batasan. Suatu bilangan dapat berupa bilangan desimal, bilangan bulat, dan bilangan negatif. Fungsi jumlah_dalam_kata memiliki fungsi di dalam check_if_single , dan fungsi check_if_single memiliki n_spell berfungsi di dalam untuk mengonversi jumlah mata uang dalam kata-kata. Saya berpikir untuk membuat paket daripada fungsi ini, tetapi saya pikir hanya fungsi yang lebih mudah untuk dipelihara.

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

Uji

SELECT amount_in_words (89378.58) FROM DUAL;

Keluaran

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

Uji melalui tabel

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

Keluaran

CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849,98 Tujuh Puluh Delapan Ribu Delapan Ratus Empat Puluh Sembilan Dolar Sembilan Puluh Delapan Sen
77493 7738829.15 Tujuh Juta Tujuh Ratus Tiga Puluh Delapan Ribu Delapan Ratus Dua Puluh Sembilan Dolar Lima Belas sen
88399 99836662388.98 Sembilan Puluh Sembilan Miliar Delapan Ratus Tiga Puluh Enam Juta Enam Ratus Enam Puluh Dua Ribu Tiga Ratus Delapan Puluh Delapan Dolar Sembilan Puluh Delapan Sen
97737 -88993.5 Negatif Delapan Puluh Delapan Ribu Sembilan Ratus Sembilan Puluh Tiga Dolar Lima Puluh Sen
88948 998349 Sembilan Ratus Sembilan Puluh Delapan Ribu Tiga Ratus Empat Puluh Sembilan Dolar

Anda dapat mengubah mata uang saat memanggil check_if_single fungsi dari amount_in_words fungsi. Misalnya, saya mengubah ke Rupee dan Paise di bagian kode PL/SQL berikut:

 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;

Uji setelah melakukan perubahan

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Keluaran

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

Mungkin Anda perlu menggeser kata Rupee dari akhir ke posisi awal baris tergantung pada format mata uang Anda dan yang dapat diubah dalam fungsi di atas dengan mudah.

Lihat juga:

  • Utilitas:Membuat Prosedur PL/SQL untuk Mengekspor Data Dari Tabel dalam 2 Menit

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa Itu Prosedur Tersimpan PL/SQL Dalam Database Oracle?

  2. Panduan Langkah-demi-Langkah untuk Menginstal MySQL di Windows

  3. ORA-04091:tabel [bla] bermutasi, pemicu/fungsi mungkin tidak melihatnya

  4. LongOpsWatcher di SQL Dev

  5. 2 Fungsi yang Mendapatkan Hari, Bulan, dan Tahun dari Tanggal di Oracle