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