Đảm bảo bạn sử dụng kiểu dữ liệu số với tỷ lệ và độ chính xác phù hợp với dữ liệu thay vì sử dụng NUMBER
không có quy mô và độ chính xác. Nếu bạn đang lưu trữ đô la / euro / bảng Anh / vv. sau đó là Tổng sản phẩm trên thế giới
là 100.000.000.000.000 đô la vào năm 2014. Giả sử rằng bạn sẽ không xử lý nhiều hơn mức này thì cột đơn vị tiền tệ của bạn có thể là:
NUMBER(17,2)
Nếu bạn nhận được giá trị lớn hơn giá trị đó thì bạn cần phải thực hiện kiểm tra dữ liệu của mình và suy nghĩ xem liệu một số tiền lớn hơn tổng sản phẩm của thế giới có hợp lý hay không. Nếu bạn định lưu trữ các giá trị, chẳng hạn như Yên hoặc đô la Zimbabwe thì hãy điều chỉnh tỷ lệ một cách thích hợp.
Bạn thậm chí có thể xác định một kiểu con trong một gói là:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
Và mã của bạn để định dạng nó có thể là:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Sau đó, nếu bạn tham chiếu loại phụ đó trong các thủ tục / gói được lưu trữ của mình, bạn sẽ không thể vượt quá kích thước tối đa của loại dữ liệu tiền tệ mà không có ngoại lệ được nêu ra. Mô hình định dạng để hiển thị giá trị chỉ cần được xác định ở một nơi duy nhất và vì đầu vào bị giới hạn ở loại phụ tiền tệ, nên chức năng định dạng sẽ không bao giờ vượt quá tỷ lệ / độ chính xác đã áp đặt và không thể xuất ra # 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;
/