根据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)
我错过了什么?
- - - - - - - - - - 更新 - - - - - - - - - - - - - - -
深入阅读可以得到这个宝石:
使用以下形式指定一个浮点数:
数字
Run Code Online (Sandbox Code Playgroud)The absence of precision and scale designators specifies the maximum range and precision for an Oracle number.
那么既然数据类型是 NUMBER 并且没有指定精度,我们可以假设它是最大精度吗?
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 变量数据类型。