2017-12-18 583 views
0

在ORACLE存儲過程中格式化數字的正確方法。使用TO_CHAR在Oracle中進行數字格式化

我需要顯示2位小數的貨幣字段。 預期輸出如下:

  • 0> 0.00
  • 5> 5.00
  • 1253.6> 1253.60
  • 1253.689> 1253.69

下面爲我工作:

select to_char(9876.23 , 'fm999990.00') from dual; 

但這有硬c的問題編了一堆9。如果我給一個更大的數字,它會顯示爲「##############」

有沒有其他方法可以做到這一點?

+0

對於較大的數字,增加格式說明符中的9。 –

+0

我會很感激,如果下來的選民可以解釋爲什麼...... :( – PAVITRA

回答

2

我需要2位小數,顯示貨幣字段。

確保您使用具有適合數據的比例和精度的數字數據類型,而不使用NUMBER而沒有比例和精度。如果你打算存儲美元/歐元/磅/等。那麼Gross World Product是的$ 100,000,000,000,000在2014年的訂單讓我們假設你是不是將要處理超過此[來源請求]那麼你的貨幣列可以是:

NUMBER(17,2) 

如果你得到一個價值大於此值,那麼您需要對您的數據執行完整性檢查,並考慮一個比世界總產品更大的數額是否合理。如果您要將這些值存儲爲例如日元或津巴布韋元,請適當調整比例。

你甚至可以在一個包中定義一個子類:

CREATE PACKAGE currencies_pkg IS 
    SUBTYPE currency_type IS NUMBER(17,2); 

    FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE 
) RETURN VARCHAR2; 
END; 
/

您的代碼格式化,可以這樣:

CREATE PACKAGE BODY currencies_pkg IS 
    FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE 
) RETURN VARCHAR2 
    IS 
    BEGIN 
    RETURN TO_CHAR(currency_value, 'FM999999999999990D00'); 
    END; 
END; 
/

然後,如果你引用的子類型的存儲過程/包,您將無法超過貨幣數據類型的最大大小,而不會引發異常。顯示值的格式模型只需要在一個地方定義,並且由於輸入限於貨幣子類型,所以格式化函數將永遠不會超過強加的比例/精度,並且不能輸出#

CREATE PROCEDURE your_procedure(
    in_value1 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE, 
    in_value2 IN ACCOUNTS_TABLE.ACCOUNT_BALANCE%TYPE 
) 
IS 
    v_value CURRENCIES_PKG.CURRENCY_TYPE; 
BEGIN 
    -- Do something 
    v_value := in_value1 + in_value2; 
    -- Output formatted value 
    DBMS_OUTPUT.PUT_LINE(CURRENCIES_PKG.formatCurrency(v_value)); 
END; 
/
+1

這是一個合理的論據對我來說。 – PAVITRA

1

爲什麼「硬編碼一堆9」是一個問題? (如果你打算使用TO_CHAR,你需要這麼做)

select to_char(9876.23 , 'fm9999999999999999999990D00') from dual; 

ps;你可能要考慮使用D而不是.(不是每個國家使用.作爲小數點分隔 - D是語言敏感,將使用相應的符號)

相關問題