web-dev-qa-db-ja.com

Oracle整数から数値への変換

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で、精度が指定されていないため、最大精度であると想定できますか?

5
Lucas

DATA_LENGTHの22は、最大数を格納するために必要な最大バイト数です(Oracleは1バイトあたり2桁を使用します)。 NULLDATA_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変数のデータ型としてのみ使用できます。

8
Philᵀᴹ