Java 使用ojdbc6 jar获取十进制整数(22,0)
根据我在oracle 11g中的理解 整数等于数字(38,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
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)
其中:
是精度,或有效小数位数的总数,其中最高有效位数是最左边的非零位数,最低有效位数是最右边的已知位数。Oracle保证数字的可移植性,精度高达20位100进制数字,相当于39位或40位十进制数字,具体取决于小数点的位置p
是小数点到最低有效位的小数位数。刻度的范围从-84到127s
数字(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
inNUMBER(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
(不是“整数”或“小数”之类的,除非您有充分的理由将其包括在内,否则不包括精度和小数位数)。