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
-
SQL:jak korzystać z UNION i zamawiać według konkretnego wyboru?
-
oracle — Podziel wiele wartości oddzielonych przecinkami w tabeli Oracle na wiele wierszy
-
Błąd logowania Sqlplus podczas używania zmiennych bash:SP2-0306:Nieprawidłowa opcja
-
Odwołaj się do tabeli w innym schemacie, pomijając nazwę schematu
-
Nie można przekazać wartości ciągu 1,2 jako danych wejściowych do zapytania wyroczni