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