Oracle
 sql >> Base de données >  >> RDS >> Oracle

Formatage des nombres dans Oracle à l'aide de TO_CHAR

Assurez-vous d'utiliser le type de données numérique avec une échelle et une précision appropriées aux données plutôt que d'utiliser NUMBER sans échelle ni précision. Si vous allez stocker des dollars/euros/livres/etc. puis le Produit mondial brut était de l'ordre de 100 000 000 000 000 $ en 2014. Supposons que vous n'allez pas traiter plus que cela, alors votre colonne de devise peut être :

NUMBER(17,2)

Si vous obtenez une valeur supérieure à celle-ci, vous devez effectuer une vérification de l'intégrité de vos données et vous demander si un montant supérieur au produit brut mondial a du sens. Si vous souhaitez stocker les valeurs, par exemple, en yens ou en dollars zimbabwéens, ajustez l'échelle de manière appropriée.

Vous pouvez même définir un sous-type dans un package comme :

CREATE PACKAGE currencies_pkg IS
  SUBTYPE currency_type IS NUMBER(17,2);

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

Et votre code pour le formater peut être :

CREATE PACKAGE BODY currencies_pkg IS
  FUNCTION formatCurrency(
    amount IN CURRENCY_TYPE
  ) RETURN VARCHAR2
  IS
  BEGIN
    RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
  END;
END;
/

Ensuite, si vous faites référence à ce sous-type dans vos procédures/packages stockés, vous ne pourrez pas dépasser la taille maximale du type de données monétaire sans qu'une exception ne soit déclenchée. Le modèle de format pour afficher la valeur n'a besoin d'être défini qu'à un seul endroit et puisque l'entrée est limitée au sous-type de devise, la fonction de formatage ne dépassera jamais l'échelle/précision imposée et ne peut pas sortir # 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;
/