Oracle 整数到数字的转换

Luc*_*cas 5 oracle datatypes

根据Oracle 文档,创建一个包含 ANSI 类型列的表INT,Oracle 会将其转换为NUMBER(38). 根据同一份文档,NUMBER(38)应该是NUMBER精度为 38 且小数NUMBER位数为 0 的 a。但实际上,我看到的是data_precision 设置为NULLdata_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
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?

此外,我正在尝试进行从 Oracle 到 ANSI 的通用转换。有什么方法可以从元数据中确定NUMBER创建的或适合的INT?

最后,我尝试BINARY_INTEGERcreate with which出现在文档中,但 create 语句失败:

SQL> create table ltheisen.silly ( id binary_integer );
create table ltheisen.silly ( id binary_integer )
                                 *
ERROR at line 1:
ORA-00902: invalid datatype
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

- - - - - - - - - - 更新 - - - - - - - - - - - - - - -

深入阅读可以得到这个宝石:

使用以下形式指定一个浮点数:

数字

The absence of precision and scale designators specifies the maximum range and precision 
for an Oracle number.
Run Code Online (Sandbox Code Playgroud)

那么既然数据类型是 NUMBER 并且没有指定精度,我们可以假设它是最大精度吗?

Phi*_*lᵀᴹ 8

A DATA_LENGTHof 22 只是存储最大可能数字所需的最大字节数(Oracle 每字节使用 2 位数字)。ANULL 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>
Run Code Online (Sandbox Code Playgroud)

(上面输出中的“*”表示最大精度)。

BINARY_INTEGER不是可以在表列中使用的数据类型。它只能用作 PL/SQL 变量数据类型。