Pastikan Anda menggunakan tipe data angka dengan skala dan presisi yang sesuai dengan data daripada menggunakan NUMBER
tanpa skala dan presisi. Jika Anda akan menyimpan dolar/euro/pounds/dll. lalu Produk Dunia Bruto
adalah dari urutan $100.000.000.000 pada tahun 2014. Mari kita asumsikan bahwa Anda tidak akan berurusan dengan lebih dari ini maka kolom mata uang Anda dapat:
NUMBER(17,2)
Jika Anda mendapatkan nilai yang lebih besar dari itu maka Anda perlu melakukan pemeriksaan kewarasan pada data Anda dan berpikir apakah jumlah yang lebih besar dari produk bruto dunia masuk akal. Jika Anda akan menyimpan nilai sebagai, misalnya, Yen atau dolar Zimbabwe, maka sesuaikan skalanya dengan tepat.
Anda bahkan dapat mendefinisikan sub-tipe dalam sebuah paket sebagai:
CREATE PACKAGE currencies_pkg IS
SUBTYPE currency_type IS NUMBER(17,2);
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2;
END;
/
Dan kode Anda untuk memformatnya dapat berupa:
CREATE PACKAGE BODY currencies_pkg IS
FUNCTION formatCurrency(
amount IN CURRENCY_TYPE
) RETURN VARCHAR2
IS
BEGIN
RETURN TO_CHAR( currency_value, 'FM999999999999990D00' );
END;
END;
/
Kemudian jika Anda mereferensikan sub-tipe itu dalam prosedur/paket tersimpan Anda, Anda tidak akan dapat melebihi ukuran maksimum tipe data mata uang tanpa pengecualian yang dinaikkan. Model format untuk menampilkan nilai hanya perlu didefinisikan di satu tempat dan karena input terbatas pada sub-jenis mata uang, maka fungsi pemformatan tidak akan pernah melebihi skala/presisi yang ditetapkan dan tidak dapat menampilkan #
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;
/