Upewnij się, że używasz liczbowego typu danych ze skalą i precyzją odpowiednią do danych, zamiast używać LICZBA
bez skali i precyzji. Jeśli zamierzasz przechowywać dolary/euro/funty/itd. następnie Produkt Gross World
był rzędu 100 000 000 000 000 w 2014 roku. Załóżmy, że nie będziesz miał do czynienia z większą liczbą, wtedy Twoja kolumna walutowa może wyglądać następująco:
NUMBER(17,2)
Jeśli uzyskasz wartość większą niż ta, musisz przeprowadzić kontrolę poprawności danych i zastanowić się, czy kwota większa niż produkt brutto na świecie ma sens. Jeśli zamierzasz przechowywać wartości, na przykład jeny lub dolary Zimbabwe, odpowiednio dostosuj skalę.
Możesz nawet zdefiniować podtyp w pakiecie jako:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
A Twój kod do sformatowania może być:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Następnie, jeśli odwołujesz się do tego podtypu w procedurach składowanych/pakietach, nie będzie można przekroczyć maksymalnego rozmiaru typu danych waluty bez zgłaszania wyjątku. Model formatu do wyświetlania wartości musi być zdefiniowany tylko w jednym miejscu, a ponieważ dane wejściowe są ograniczone do podtypu waluty, funkcja formatowania nigdy nie przekroczy narzuconej skali/precyzji i nie może wyprowadzić # 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;
/