19

最近、db2 から Oracle への移行プロジェクトに取り組んでいるときに、この状況に遭遇しました。開発者は、decimal(s,p) 列を使用して新しいテーブル構造をうっかり作成していました。私はOracleがこれをサポートしていたことを覚えていませんでしたが、掘り下げたところ、ANSIデータ型であるため、Oracleでサポートされていることがわかりました。

しかし、私にとって疑問は残りました -

  1. このデータは内部でどのように処理されますか?
  2. Oracle の組み込み型の代わりに ANSI 型を使用するコストはありますか?
  3. ターゲット タイプが Oracle 組み込みタイプの場合、データ移行中に影響はありますか?
4

2 に答える 2

18

Oracleでは、それらは同じです:

テーブルとクラスターを作成する SQL ステートメントでは、ANSI データ型と、IBM 製品の SQL/DS および DB2 のデータ型も使用できます。Oracle は、Oracle データベースのデータ型名とは異なる ANSI または IBM のデータ型名を認識します。データ型を同等の Oracle データ型に変換し、Oracle データ型を列データ型の名前として記録し、次の表に示す変換に基づいて列データを Oracle データ型に格納します。

この引用の下の表は、DECIMAL(p,s)が内部的に次のように扱われることを示していNUMBER(p,s)ます。

SQL> create table t (a decimal(*,5), b number (*, 5));

Table created

SQL> desc t;
Name Type        Nullable Default Comments 
---- ----------- -------- ------- -------- 
A    NUMBER(*,5) Y                         
B    NUMBER(*,5) Y  

ただし、スケールのデフォルトは の 0 です。つまりDECIMALDECIMAL(*)は として扱われます。NUMBER(*, 0)INTEGER

SQL> create table t (a decimal, b number, c decimal (5), d decimal (5));

Table created

SQL> desc t;
Name Type      Nullable Default Comments 
---- --------- -------- ------- -------- 
A    INTEGER   Y                         
B    NUMBER    Y                         
C    NUMBER(5) Y                         
D    NUMBER(5) Y   
于 2012-06-14T11:00:54.130 に答える
-2

実は小数と数には違いがあります。Decimal はオーバースケールの値を切り捨て、number は値を四捨五入します。

于 2012-12-19T03:31:09.587 に答える