sql >> Base de Datos >  >> RDS >> Oracle

Formateo de números en Oracle usando TO_CHAR

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