我需要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;
/