データベース設計の落とし穴?Oracle NUMBER データ型のデフォルト値を理解しよう
Oracleにおける数値データ型「NUMBER」のデフォルト精度とスケール
精度 は、数値が持つ 桁数 を決定します。一方、スケール は、小数点 以下 に許容される 桁数 を決定します。
デフォルト値
- 精度: 10
- スケール: 0
つまり、デフォルトでは、NUMBER 型は 10桁 の数値を格納することができ、そのうち 小数点以下は0桁 までとなります。
例
-- デフォルトの精度とスケールを持つ NUMBER 型カラムの作成
CREATE TABLE my_table (
id NUMBER,
price NUMBER
);
この場合、id
カラムは 10桁 までの整数を格納し、price
カラムは 10桁 までの数値を格納でき、そのうち 小数点以下は0桁 までとなります。
精度とスケールの変更
デフォルトの精度とスケールは、カラム定義時に変更することができます。
-- 精度を5桁、スケールを2桁に設定した NUMBER 型カラムの作成
CREATE TABLE my_table (
price NUMBER(5,2)
);
注意点
- 精度は、スケールよりも 大き くする必要があります。
- 38桁以上の精度を持つ数値は、移植性が保証されません。
- 特殊な用途には、BINARY_INTEGER, BINARY_FLOAT, DECIMAL などの他の数値データ型を使用することもできます。
OracleにおけるNUMBERデータ型の精度とスケール:サンプルコード
デフォルトの精度とスケール
-- デフォルトの精度とスケールを持つNUMBER型カラムの作成
CREATE TABLE my_table (
id NUMBER,
price NUMBER
);
-- データ挿入
INSERT INTO my_table (id, price) VALUES (1, 123.45);
-- データの確認
SELECT * FROM my_table;
出力:
ID PRICE
--- --------
1 123.45
解説:
- このコードは、
my_table
という名前のテーブルを作成します。 - このテーブルには、
id
という整型カラムと、price
というデフォルトの精度とスケールを持つNUMBER型カラムが含まれています。 INSERT
ステートメントを使用して、id
に 1、price
に 123.45という値を挿入します。SELECT
ステートメントを使用して、my_table
テーブルの内容を確認します。
-- 精度を5桁、スケールを2桁に設定したNUMBER型カラムの作成
CREATE TABLE my_table (
price NUMBER(5,2)
);
-- データ挿入
INSERT INTO my_table (price) VALUES (123.4567);
-- データの確認
SELECT * FROM my_table;
PRICE
---------
123.46
出力結果 では、price
列の値が 46 に丸められていることが確認できます。これは、スケールが2桁に設定されているためです。
-- 列の精度とスケールを取得
SELECT data_type, data_precision, data_scale
FROM user_tab_cols
WHERE table_name = 'my_table' AND column_name = 'price';
-- 数値の精度とスケールを取得
SELECT TO_PRECISION(123.4567, 5, 2);
DATA_TYPE DATA_PRECISION DATA_SCALE
--------- -------------- ----------
NUMBER(5,2) 5 2
123.46
- 1つ目の
SELECT
ステートメントは、my_table
テーブルのprice
カラムの精度とスケールを取得します。 - 2つ目の
SELECT
ステートメントは、TO_PRECISION
関数を使用して、数値 123.4567 の精度を5桁、スケールを2桁に変更します。
このサンプルコードは、OracleにおけるNUMBERデータ型の精度とスケールの基本的な操作を理解するのに役立ちます。
補足:
- より複雑な操作については、Oracleの公式ドキュメントを参照してください。
- 特定の状況に適した精度とスケールを選択することが重要です。
Oracleにおける数値データ型「NUMBER」のデフォルト精度とスケール:その他の方法
TO_NUMBER
関数は、文字列を数値に変換するために使用できます。この関数には、精度とスケールを指定するオプション引数があります。
-- 文字列を精度5桁、スケール2桁の数値に変換
SELECT TO_NUMBER('123.4567', '99999', '0.00');
123.46
-- 文字列を精度5桁、スケール2桁の数値に変換
SELECT CAST('123.4567' AS NUMBER(5,2));
123.46
制約
精度とスケールを制限するために、カラムに制約を設定することができます。
-- 精度を5桁、スケールを2桁に制限する制約の作成
ALTER TABLE my_table
ADD CONSTRAINT price_precision_constraint CHECK (price BETWEEN -999.99 AND 999.99);
データ型変換
既存のカラムの精度とスケールを変更するには、データ型変換を使用することができます。
-- カラムの精度を5桁、スケールを2桁に変更
ALTER TABLE my_table
MODIFY price NUMBER(5,2);
database oracle number-formatting