Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle:Chuyển đổi số tiền tệ thành từ sử dụng PL / SQL

Dưới đây tôi đưa ra một ví dụ về chức năng được lưu trữ của Oracle để chuyển đổi số tiền tệ bằng chữ bằng cách sử dụng PL / SQL. Ví dụ:số tiền 123,45 đô la sẽ được dịch là Một trăm hai mươi ba đô la và bốn mươi lăm xu. Ngoài ra, bạn có thể thay đổi đơn vị tiền tệ trong chức năng, chẳng hạn như Rupee và Paise.

Oracle PL / SQL Hàm để chuyển đổi số tiền tệ thành từ ngữ

Hàm lưu trữ Oracle PL / SQL sau đây chấp nhận một đối số số và không có giới hạn. Một số có thể là số thập phân, số nguyên và số âm. Hàm amount_in_words có một chức năng bên trong check_if_single và hàm check_if_single có n_spell chức năng bên trong để chuyển đổi số tiền tệ bằng chữ. Tôi đã nghĩ đến việc tạo một gói thay vì hàm này, nhưng tôi nghĩ rằng chỉ một hàm sẽ dễ bảo trì hơn.

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

Kiểm tra

SELECT amount_in_words (89378.58) FROM DUAL;

Đầu ra

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

Kiểm tra qua bảng

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

Đầu ra

CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
88499 78849,98 Bảy mươi tám nghìn tám trăm bốn mươi chín đô la và chín mươi tám xu
77493 7738829.15 Bảy triệu bảy trăm ba mươi tám nghìn tám trăm hai mươi chín đô la và mười lăm xu
88399 99836662388,98 Chín mươi chín tỷ tám trăm ba mươi sáu triệu sáu trăm sáu mươi hai nghìn ba trăm tám mươi tám đô la và chín mươi tám xu
97737 - 88993,5 Âm tám mươi tám nghìn chín trăm chín mươi ba đô la và năm mươi xu
88948 998349 Chín trăm chín mươi tám nghìn ba trăm bốn mươi chín đô la

Bạn có thể thay đổi đơn vị tiền tệ khi gọi check_if_single chức năng từ amount_in_words hàm số. Ví dụ:tôi đã thay đổi thành Rupees và Paise trong phần sau của mã 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;

Kiểm tra sau khi thực hiện thay đổi

SELECT amount_in_words (7836.58) in_words FROM DUAL;

Đầu ra

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

Có thể bạn cần chuyển từ Rupees từ vị trí cuối sang vị trí bắt đầu của dòng tùy thuộc vào định dạng tiền tệ của bạn và có thể thay đổi dễ dàng trong hàm trên.

Xem thêm:

  • Tiện ích:Tạo quy trình PL / SQL để xuất dữ liệu từ bảng trong 2 phút
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đổi tên Bảng hoặc Chế độ xem Oracle

  2. Oracle - ORA-06502:PL / SQL:lỗi số hoặc giá trị (DBMS_OUTPUT)

  3. TNS-12519 w / o Đã đạt được các quy trình tối đa

  4. Chuyển đổi từ RAW của Oracle (16) sang GUID của .NET

  5. Giải pháp để không thể thực hiện một hoạt động DML bên trong một truy vấn?