sql >> データベース >  >> RDS >> Oracle

Oracle:PL/SQLを使用してWordで通貨額を変換する

    以下に、PL/SQLを使用して通貨金額を単語に変換するOracleストアド関数の例を示します。たとえば、123.45ドルの金額は、123ドルと45セントに相当します。また、ルピーやパイサなど、機能の通貨を変更することもできます。

    通貨金額を単語に変換するOraclePL/SQL関数

    次のOraclePL/ SQLストアド関数は数値引数を受け入れ、制限はありません。数値は、10進数、整数、および負の数にすることができます。関数amount_in_words check_if_single内に関数があります 、およびcheck_if_single関数には n_spellがあります 内部で機能して、通貨の金額を単語に変換します。この関数の代わりにパッケージを作成することを考えていましたが、関数だけが保守しやすいと思いました。

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

    テスト

    SELECT amount_in_words (89378.58) FROM DUAL;

    出力

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

    テーブルを介してテスト

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

    出力

    78万8百49ドルと98セント 七百万七百三十八千八百二十九ドル15セント 98億8300万6800万2800ドル98セント マイナス88万9,93ドル50セント 九百九十八千三百四十九ドル
    CLIENT_CODE BALANCE_AMT BALANCE_AMOUNT_IN_WORDS
    88499 78849.98
    77493 7738829.15
    88399 99836662388.98
    97737 -88993.5
    88948 998349

    check_if_singleを呼び出すときに通貨を変更できます amount_in_wordsからの関数 働き。たとえば、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;

    変更後のテスト

    SELECT amount_in_words (7836.58) in_words FROM DUAL;

    出力

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

    通貨の形式によっては、ルピーという単語を行の最後から最初の位置に移動する必要があるかもしれません。これは、上記の関数で簡単に変更できます。

    関連項目:

    • ユーティリティ:2分でテーブルからデータをエクスポートするためのPL/SQLプロシージャを生成します
    1. SQLiteQueryBuilderのselectionArgsは、列の整数値では機能しません

    2. PHP PDO(FreeTDS)でのみ最初の255文字を返すMSSQLServerでのODBCクエリ

    3. UTL_FILE.FOPEN()プロシージャがディレクトリのパスを受け入れていませんか?

    4. SQL Server、誤解を招くXLOCKと最適化