Sørg for, at du bruger taldatatypen med en skala og præcision, der passer til dataene i stedet for at bruge NUMBER
uden skala og præcision. Hvis du skal gemme dollars/euro/pund/osv. derefter Gross World Product
var af størrelsesordenen $100.000.000.000.000 i 2014. Lad os antage, at du ikke har at gøre med mere end dette, så kan din valutakolonne være:
NUMBER(17,2)
Hvis du får en værdi, der er større end det, så skal du udføre et fornuftstjek på dine data og tænke over, om et beløb større end verdens bruttoprodukt giver mening. Hvis du skal gemme værdierne som f.eks. yen eller zimbabwiske dollars, så juster skalaen passende.
Du kan endda definere en undertype i en pakke som:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
Og din kode til at formatere den kan være:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Så hvis du refererer til den undertype i dine lagrede procedurer/pakker, vil du ikke være i stand til at overskride den maksimale størrelse af valutadatatypen uden at der er rejst en undtagelse. Formatmodellen til visning af værdien skal kun defineres et enkelt sted, og da inputtet er begrænset til valutaundertypen, vil formateringsfunktionen aldrig overskride den pålagte skala/præcision og kan ikke udsende # 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;
/