Unten gebe ich ein Beispiel für eine gespeicherte Oracle-Funktion zum Konvertieren von Währungsbeträgen in Wörtern mit PL/SQL. Zum Beispiel würde der Betrag von 123,45 $ als einhundertdreiundzwanzig Dollar und fünfundvierzig Cent übersetzt. Außerdem können Sie die Währung in Funktion ändern, z. B. Rupien und Paise.
Oracle PL/SQL-Funktion zum Konvertieren des Währungsbetrags in Wörtern
Die folgende gespeicherte Oracle PL/SQL-Funktion akzeptiert ein numerisches Argument und hat keine Einschränkungen. Eine Zahl kann eine Dezimalzahl, eine ganze Zahl und eine negative Zahl sein. Die Funktion amount_in_words hat eine Funktion innerhalb von check_if_single , und die check_if_single-Funktion hat ein n_spell Funktion im Inneren, um den Währungsbetrag in Wörter umzuwandeln. Ich dachte daran, ein Paket anstelle dieser Funktion zu erstellen, aber ich dachte, dass nur eine Funktion einfacher zu warten wäre.
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;
Ausgabe
Eighty-Nine Thousand Three Hundred Seventy-Eight Dollar and Fifty-Eight Cents
Durch eine Tabelle testen
SELECT client_code,
balance_amt,
amount_in_words (balance_amt) balance_amount_in_words
FROM account_balance; Ausgabe
| CLIENT_CODE | BALANCE_AMT | BALANCE_AMOUNT_IN_WORDS |
|---|---|---|
| 88499 | 78849,98 | Achtundsiebzigtausendachthundertneunundvierzig Dollar und achtundneunzig Cent |
| 77493 | 7738829.15 | Sieben Millionen Siebenhundertachtunddreißigtausendachthundertneunundzwanzig Dollar und fünfzehn Cent |
| 88399 | 99836662388,98 | Neunundneunzig Milliarden Achthundertsechsunddreißig Millionen Sechshundertzweiundsechzigtausenddreihundertachtundachtzig Dollar und achtundneunzig Cent |
| 97737 | -88993.5 | Minus achtundachtzigtausendneunhundertdreiundneunzig Dollar und fünfzig Cent |
| 88948 | 998349 | Neunhundertachtundneunzigtausenddreihundertneunundvierzig Dollar |
Beim Aufruf von check_if_single können Sie die Währung ändern Funktion von amount_in_words Funktion. Zum Beispiel habe ich im folgenden Teil des PL/SQL-Codes zu Rupees and Paise geändert:
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; Nach der Änderung testen
SELECT amount_in_words (7836.58) in_words FROM DUAL;
Ausgabe
Seven Thousand Eight Hundred Thirty-Six Rupees and Fifty-Eight Paise
Möglicherweise müssen Sie das Wort Rupees von der End- zur Startposition der Zeile verschieben, abhängig von Ihrem Währungsformat und das kann in der obigen Funktion einfach geändert werden.
Siehe auch:
- Hilfsprogramm:Generieren Sie eine PL/SQL-Prozedur zum Exportieren von Daten aus einer Tabelle in 2 Minuten