使用ojdbc6 jar获取int作为十进制(22,0)

时间:2016-05-24 14:10:11

标签: java oracle jdbc oracle11g

根据我在oracle 11g中的理解,

INTEGER相当于NUMBER(38,0)

我正在使用squirrel-sql-3.6客户端来检查oracle表的数据和元数据。

我使用SQL脚本创建了一个表:

CREATE TABLE "ABC"."TABLE01"
(
   NUM_INT INTEGER
)
;

当我点击获取创建表脚本时,它给了我:

CREATE TABLE "ABC"."TABLE01"
(
   NUM_INT decimal(22,0)
)
;

我期待NUM_INT类型为十进制(38,0)

我正在使用 Oracle数据库11g第2版(11.2.0.1)ojdbc6.jar

我也尝试过使用Java代码:

 try (Connection con = DriverManager.getConnection(connectionUri, userName, password);) {
         DatabaseMetaData metadata = con.getMetaData();
         ResultSet rs = metadata.getColumns(schemaName, null, tableName, null);

       } catch (SQLException e) {
         LOG.info("SQLException. Caused By: " + e);
}

输出:

ordinalPosition:1
columnName:NUM_INT 
dataType:NUMBER 
precision:22 
scale:0 
columnSize:22 
nullable:false 
foreignKey:false 
autoIncrement:false

这是这个特殊版本的jar的问题吗?

P.S。我正在使用Java 7

2 个答案:

答案 0 :(得分:1)

您认为INTEGER映射到NUMBER(38)到Oracle 10.2之前是正确的。

请参阅 ANSI数据类型转换为Oracle数据类型

<强> 9.2

http://docs.oracle.com/cd/B10501_01/server.920/a96540/sql_elements2a.htm#114927

<强> 10.2

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i54335

从11.2开始,映射定义为

INTEGER NUMBER(p,0)

<强> 11.2

http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF00213

<强> 12.1

http://docs.oracle.com/database/121/SQLRF/sql_elements001.htm#SQLRF55581

不幸的是我找不到p ...

的定义

JDBC驱动程序可能会在data_length丢失的情况下使用data_precision ...

CREATE TABLE  "TABLE01"
(
   NUM_INT INTEGER
)
; 
CREATE TABLE  "TABLE02"
(
   NUM_INT NUMBER(38,0)
)
;
select TABLE_NAME, substr(DATA_TYPE,1,15) DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE 
from user_tab_columns where table_name like 'TABLE0_';

TABLE_NAME                     DATA_TYPE       DATA_LENGTH DATA_PRECISION DATA_SCALE
------------------------------ --------------- ----------- -------------- ----------
TABLE01                        NUMBER                   22                         0 
TABLE03                        NUMBER                   22             38          0  

Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

我的解释

1)p中的NUMBER(p,0)未记录,因此设置为“null

2)JDBC驱动程序看不到精度,因此需要长度而不是它。

我不确定这是否是绝对正确的行为,但我会尽量避免使用非Oracle数据类型。

答案 1 :(得分:0)

可显示的十进制数字与存储这些数字的字节数之间存在一些混淆。

查看NUMBER data type documentation

  

NUMBER数据类型

     

使用以下格式指定定点数:

NUMBER(p,s)
     

其中:

     
      
  • p是精确度或有效小数位的总数,其中最高有效位是最左边的非零数字,最低有效位是最右边的已知数字。 Oracle保证数字的可移植性,精度最高可达20个base-100位,相当于39或40个十进制数字,具体取决于小数点的位置。
  •   
  • s是从小数点到最低有效数字的比例或位数。比例范围可以从-84到127。
  •   

internally

  

内部数字格式

     

Oracle以可变长度格式存储数字数据。每个值都以科学计数法存储,1个字节用于存储指数,最多20个字节用于存储尾数。结果值限制为38位精度。 Oracle不存储前导零和尾随零。例如,数字412以类似于4.12×102的格式存储,其中1个字节用于存储指数(2),2个字节用于存储尾数(4,1,2)的三个有效数字。负数包括其长度的符号。   因此,Oracle以22个字节存储NUMBER(38) - 该数字的最高有效数字使用20个基数-100个数字(每个1个字节)存储,其余数字用于数字的精度(尽管仅限Oracle)保证最多可存储38位小数。)

驱动程序可能正在将Oracle的base-100格式(计数位)中的值转换为十进制浮点表示(计算字节数)。