小编典典

Oracle中使用TO_CHAR进行数字格式设置

sql

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

但这存在硬编码一堆9的问题。如果我提供更大的数字,它将显示为“ ###############”

我还有其他方法可以做到这一点吗?


阅读 378

收藏
2021-04-28

共1个答案

小编典典

我需要显示2位小数的货币字段。

确保使用数字数据类型,并且其缩放比例和精度适合于数据,而不要使用NUMBER没有缩放比例和精度的数字数据类型。如果您要存储美元/欧元/英镑/等。那么2014年世界生产总值(Gross
World
Product
)约为1亿亿美元。假设您处理的金额不会超过此[需要的引文],那么您的货币栏可以是:

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

Then if you reference that sub-type in your stored procedures/packages you
will not be able to exceed the maximum size of the currency data type without
an exception being raised. The format model for displaying the value only
needs to be defined in a single place and since the input is limited to the
currency sub-type, then the formatting function will never exceed the imposed
scale/precision and cannot output #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;
/
2021-04-28