Ujistěte se, že používáte datový typ čísla s měřítkem a přesností vhodnou pro data, nikoli NUMBER
bez měřítka a přesnosti. Pokud budete ukládat dolary/eura/libry/atd. pak Gross World Product
byla v roce 2014 řádově 100 000 000 000 000 $. Předpokládejme, že se nebudete zabývat více než tímto, pak může být sloupec měny:
NUMBER(17,2)
Pokud získáte hodnotu, která je větší než tato, musíte provést kontrolu svých dat a popřemýšlet, zda má smysl větší částka, než je světový hrubý produkt. Pokud se chystáte uložit hodnoty jako například jen nebo zimbabwské dolary, upravte odpovídajícím způsobem měřítko.
Můžete dokonce definovat podtyp v balíčku jako:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
A váš kód pro jeho formátování může být:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Pokud se pak ve svých uložených procedurách/balíčcích odkážete na tento podtyp, nebudete moci překročit maximální velikost datového typu měny, aniž by byla vyvolána výjimka. Model formátu pro zobrazení hodnoty musí být definován pouze na jednom místě, a protože vstup je omezen na podtyp měny, pak funkce formátování nikdy nepřekročí předepsanou míru/přesnost a nemůže vypsat # 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;
/