Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ojdbc6 jar获取十进制整数(22,0)_Java_Oracle_Jdbc_Oracle11g - Fatal编程技术网

Java 使用ojdbc6 jar获取十进制整数(22,0)

Java 使用ojdbc6 jar获取十进制整数(22,0),java,oracle,jdbc,oracle11g,Java,Oracle,Jdbc,Oracle11g,根据我在oracle 11g中的理解 整数等于数字(38,0) 我正在使用squirrel-sql-3.6client检查oracle表的数据和元数据 我使用SQL脚本创建了一个表: CREATE TABLE "ABC"."TABLE01" ( NUM_INT INTEGER ) ; 当我单击获取创建表脚本时,它给了我: CREATE TABLE "ABC"."TABLE01" ( NUM_INT decimal(22,0) ) ; 我需要十进制(38,0)类型的NUM_INT

根据我在oracle 11g中的理解

整数等于数字(38,0)

我正在使用
squirrel-sql-3.6
client检查oracle表的数据和元数据

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

CREATE TABLE "ABC"."TABLE01"
(
   NUM_INT INTEGER
)
;
当我单击获取创建表脚本时,它给了我:

CREATE TABLE "ABC"."TABLE01"
(
   NUM_INT decimal(22,0)
)
;
我需要十进制(38,0)类型的NUM_INT

我正在使用Oracle Database 11g Release 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的问题吗


另外,我使用的是Java 7,在可以显示的十进制数字数量和这些数字存储的字节数量之间存在一些混淆

查看以下内容:

数字数据类型

使用以下形式指定定点编号:

NUMBER(p,s)
其中:

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

内部数字格式

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


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

在Oracle 10.2之前,整数映射到数字(38)的假设是正确的

看 ANSI数据类型转换为Oracle数据类型

9.2

10.2

从11.2开始,映射定义为

整数(p,0)

11.2

12.1

不幸的是,我找不到
p
的定义

JDBC驱动程序可能正在使用
数据长度
,以防
数据精度
丢失

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 11.2.0.2.0版-生产版

我的解释

1)
p
in
NUMBER(p,0)
中的
p
没有记录,因此设置为“null”

2) JDBC驱动程序看不到精度,因此采用长度而不是长度


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

您在上面说过,当您单击“创建表脚本”时,它告诉您它是一个
十进制(22,0)
。那么你为什么怀疑这个罐子呢???@dcsohl你不认为它应该是
十进制(38,0)
?我从来没有说过我认为它应该是什么。但是您使用SQL脚本创建了它,并通过要求数据库创建表脚本来检查它,它告诉您
decimal(22,0)
。那么Java与这些有什么关系呢?@dcsohl我的朋友,生气是没有意义的。请平静地再读一遍这个问题。我认为问题在于这个ojdbc6.jar(11.2.0.1)。我通过squirrel和javajdbc进行了测试,得到了相同的结果(22,0),但根据文档,应该是(38,0)。在您的具体情况下,是否有任何理由对结果数字的大小进行硬编码?Oracle SQL中通常的声明只是
NUM\u INT number
(不是“整数”或“小数”之类的,除非您有充分的理由将其包括在内,否则不包括精度和小数位数)。