Zorg ervoor dat u het gegevenstype nummer gebruikt met een schaal en precisie die past bij de gegevens in plaats van NUMBER
zonder schaal en precisie. Als u dollars/euro's/ponden/etc. dan het Bruto Wereldproduct
was in de orde van $ 100.000.000.000.000 in 2014. Laten we aannemen dat u niet met meer dan dit te maken krijgt, dan kan uw valutakolom zijn:
NUMBER(17,2)
Als u een waarde krijgt die groter is dan dat, moet u een gezondheidscheck op uw gegevens uitvoeren en bedenken of een bedrag dat groter is dan het brutoproduct van de wereld zinvol is. Als u de waarden gaat opslaan als bijvoorbeeld yen of Zimbabwaanse dollars, pas de schaal dan op de juiste manier aan.
Je zou zelfs een subtype in een pakket kunnen definiëren als:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
En je code om het te formatteren kan zijn:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Als u vervolgens naar dat subtype verwijst in uw opgeslagen procedures/pakketten, kunt u de maximale grootte van het valutagegevenstype niet overschrijden zonder dat er een uitzondering wordt gemaakt. Het formaatmodel voor het weergeven van de waarde hoeft maar op één plaats te worden gedefinieerd en aangezien de invoer beperkt is tot het valutasubtype, zal de opmaakfunctie nooit de opgelegde schaal/precisie overschrijden en kan # v.
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;
/