Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Formatação de números no Oracle usando TO_CHAR


Certifique-se de usar o tipo de dados numérico com escala e precisão apropriadas aos dados, em vez de usar NUMBER sem escala e precisão. Se você for armazenar dólares/euros/libras/etc. em seguida, o Produto Mundial Bruto era da ordem de $ 100.000.000.000.000 em 2014. Vamos supor que você não vai lidar com mais do que isso, então sua coluna de moeda pode ser:
NUMBER(17,2)

Se você obtiver um valor maior que isso, precisará realizar uma verificação de integridade em seus dados e pensar se um valor maior que o produto bruto mundial faz sentido. Se você for armazenar os valores como, por exemplo, ienes ou dólares do Zimbábue, ajuste a escala adequadamente.

Você pode até definir um subtipo em um pacote como:
CREATE PACKAGE currencies_pkg IS
  SUBTYPE currency_type IS NUMBER(17,2);

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

E seu código para formatá-lo pode ser:
CREATE PACKAGE BODY currencies_pkg IS
  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2
  IS
  BEGIN
    RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
  END;
END;
/

Então, se você fizer referência a esse subtipo em seus procedimentos/pacotes armazenados, não poderá exceder o tamanho máximo do tipo de dados de moeda sem que uma exceção seja gerada. O modelo de formato para exibir o valor só precisa ser definido em um único local e, como a entrada é limitada ao subtipo de moeda, a função de formatação nunca excederá a escala/precisão imposta e não poderá gerar # 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;
/