根据Oracle 文档,创建具有 ANSI 类型列的表INT
,Oracle 会将其转换为NUMBER(38)
. 根据同一份文档,NUMBER(38)
应该是NUMBER
精度为 38 且比例为 0 的 a。但在实践中,我看到 aNUMBER
的 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
文档中出现的创建,但创建语句失败:
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 并且没有指定精度,我们可以假设它是最大精度吗?
A
DATA_LENGTH
of 22 只是存储最大可能数字所需的最大字节数(Oracle 使用每个字节 2 位)。ANULL
DATA_PRECISION
表示最大值为 38。您可以通过以下方式验证这一点
DBMS_METADATA
:(上面输出中的“*”表示最大精度)。
BINARY_INTEGER
不是可以在表列中使用的数据类型。它只能用作 PL/SQL 变量数据类型。