我需要显示带有 2 位小数的货币字段。
确保使用具有适合数据的比例和精度的数字数据类型,而不是使用没有比例和精度的NUMBER。如果您要存储美元/欧元/英镑/等。那么Gross World Product 在 2014 年的金额为 100,000,000,000,000 美元。假设您的交易量不会超过这个[需要引用],那么您的货币列可以是:
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;
/
然后,如果您在存储过程/包中引用该子类型,您将无法超过货币数据类型的最大大小,而不会引发异常。显示值的格式模型只需要在一个地方定义,由于输入仅限于货币子类型,因此格式化函数永远不会超过强制的比例/精度,并且无法输出#s。
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;
/