NUMBER
を使用するのではなく、データに適したスケールと精度の数値データ型を使用するようにしてください スケールと精度なし。ドル/ユーロ/ポンドなどを保管する場合。次に、 Gross World Product
2014年には$100,000,000,000,000のオーダーでした。これ以上の取引を行わない場合、通貨の列は次のようになります。
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;
/
次に、ストアドプロシージャ/パッケージでそのサブタイプを参照する場合、例外が発生しない限り、通貨データ型の最大サイズを超えることはできません。値を表示するためのフォーマットモデルは1つの場所で定義するだけでよく、入力は通貨サブタイプに制限されるため、フォーマット関数は課せられたスケール/精度を超えることはなく、#を出力することはできません。コード> 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;
/