Уверете се, че използвате числовия тип данни с мащаб и прецизност, подходящи за данните, вместо да използвате NUMBER
без мащаб и прецизност. Ако ще съхранявате долари/евро/паундове/и т.н. след това Брутния световен продукт
беше от порядъка на $100 000 000 000 000 през 2014 г. Да приемем, че няма да имате работа с повече от това, тогава вашата валутна колона може да бъде:
NUMBER(17,2)
Ако получите стойност, която е по-голяма от тази, тогава трябва да извършите проверка за надеждност на вашите данни и да помислите дали има смисъл сума, по-голяма от световния брутен продукт. Ако ще съхранявате стойностите като например йени или зимбабвийски долари, коригирайте скалата по подходящ начин.
Можете дори да дефинирате подтип в пакет като:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
А вашият код за форматиране може да бъде:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
След това, ако посочите този подтип във вашите съхранени процедури/пакети, няма да можете да надвишите максималния размер на типа данни за валута, без да бъде повдигнато изключение. Моделът на формат за показване на стойността трябва да бъде дефиниран само на едно място и тъй като въвеждането е ограничено до подтипа на валутата, тогава функцията за форматиране никога няма да надхвърли наложения мащаб/прецизност и не може да изведе #код> с.
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;
/