Asegúrese de utilizar el tipo de datos de número con la escala y la precisión adecuadas a los datos en lugar de utilizar NUMBER
sin escala y precisión. Si va a almacenar dólares/euros/libras/etc. luego el Producto mundial bruto
fue del orden de $ 100,000,000,000,000 en 2014. Supongamos que no va a lidiar con más que esto, entonces su columna de moneda puede ser:
NUMBER(17,2)
Si obtiene un valor que es mayor que eso, debe realizar una verificación de cordura en sus datos y pensar si una cantidad mayor que el producto bruto mundial tiene sentido. Si va a almacenar los valores como, por ejemplo, yenes o dólares de Zimbabue, ajuste la escala adecuadamente.
Incluso podría definir un subtipo en un paquete como:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
Y tu código para formatearlo puede 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;
/
Entonces, si hace referencia a ese subtipo en sus procedimientos/paquetes almacenados, no podrá exceder el tamaño máximo del tipo de datos de moneda sin que se genere una excepción. El modelo de formato para mostrar el valor solo debe definirse en un solo lugar y, dado que la entrada se limita al subtipo de moneda, la función de formato nunca excederá la escala/precisión impuesta y no podrá generar #
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;
/