Oracleドキュメント によると、ANSIタイプINT
の列を持つテーブルを作成すると、OracleはそれをNUMBER(38)
に変換します。同じドキュメントによると、NUMBER(38)
は、精度が38でスケールが0のNUMBER
であると想定されています。しかし、実際にはNUMBER
がdata_precisionはNULL
に設定され、data_lengthは22に設定されます。
SQL> create table ltheisen.silly ( id int );
Table created.
SQL> select substr(data_type,1,10), data_length, data_scale, data_precision from
all_tab_columns where owner='LTHEISEN' and table_name='SILLY' and column_name='
ID';
SUBSTR(DATA_TYPE,1,10) DATA_LENGTH DATA_SCALE DATA_PRECISION
---------------------------------------- ----------- ---------- --------------
NUMBER 22 0
何ができますか?
また、OracleからANSIへの一般的な変換を実行しようとしています。メタデータからNUMBER
が作成された、またはINT
に適合したことを確認する方法はありますか?
最後に、ドキュメントに記載されているBINARY_INTEGER
を使用して作成しようとしましたが、createステートメントが失敗します。
SQL> create table ltheisen.silly ( id binary_integer );
create table ltheisen.silly ( id binary_integer )
*
ERROR at line 1:
ORA-00902: invalid datatype
何が欠けていますか?
--------------------更新-----------------------------
少し深く読むと、この宝石が得られます。
次の形式を使用して、浮動小数点数を指定します。
[〜#〜]番号[〜#〜]
The absence of precision and scale designators specifies the maximum range and precision for an Oracle number.
データ型がNUMBERで、精度が指定されていないため、最大精度であると想定できますか?
DATA_LENGTH
の22は、最大数を格納するために必要な最大バイト数です(Oracleは1バイトあたり2桁を使用します)。 NULL
DATA_PRECISION
は、最大値が38であることを意味します。
これはDBMS_METADATA
で確認できます:
SQL> create table sotmp ( a int );
Table created.
SQL> select dbms_metadata.get_ddl('TABLE','SOTMP')
2 from dual;
DBMS_METADATA.GET_DDL('TABLE','SOTMP')
--------------------------------------------------------------------------------
CREATE TABLE "PHIL"."SOTMP"
( "A" NUMBER(*,0)
) SEGMENT CREATION DEFER
SQL>
(上記の出力の「*」は最大精度を示します)。
BINARY_INTEGER
は、テーブルの列で使用できるデータ型ではありません。これは、PL/SQL変数のデータ型としてのみ使用できます。