我使用的是Oracle的JDBC Thin驱动程序(10.2.0.3),用于连接到Oracle 10g数据库。 我想获得关于数据库列的信息,所以我用ResultSetMetaData的 。 我所需要的最重要的信息是列和长度的类型,所以我用getColumnType , getPrecision和的getScale方法。
它适用于一个简单的查询( select * from tablename
)如果列类型是“简单的”像VARCHAR2(50), NUMBER(5), NUMBER(6,2)
如果我有一个更复杂的查询( select count(*) from tablename
或基于视图的查询包含一些复杂的计算,该方法给出像怪异的结果:
-
getScale
:-127 - 既
getPrecision
和getScale
是0 -
getPrecision
:-1
设置oracle.jdbc.J2EE13Compliant
连接属性设置为true
(由几个网页的建议)消除的getScale = -127,但仍返回0/0的结果。
最有可能我要创建这些奇怪的结果解决方法,但首先我至少需要有关Oracle的ResultSetMetaData行为的全面的文档。 例如与getPrecision /的getScale的所有SQL类型的含义的巨大表将是巨大的。 有没有这样一个地方的文档?
Oracle无法返回基于视图或类型count(*)
因为它没有明确声明。 你的观点可以返回取决于视图的垫层表的任何精度或小数。
为了克服这一点,你就需要转换类型在查询或查看这样的:
select CAST (count(*) AS NUMBER(30))
另一种方法是查询user_tab_columns
或all_tab_columns
。
0分是可以接受的:一个数字(5)是相同的数字(5,0)
然而,精度必须在定义时1和38之间的整数。 当它是不确定的,如数量,驾驶员必须返回的东西,因为它不能返回null。 在这种情况下,驱动程序选择返回0。
在我看来,有上的ResultSetMetaData没有全面的文档。 的Oracle®数据库JDBC开发人员指南与参考10g第2版(10.2)和11g第2版(11.2)给出例如关于列名和类型在这里 ,他们不与其他方面的处理。
有人有类似的问题,以前在PostgreSQL年,他做了一个补丁。 也许甲骨文在这里使用相同的代码库。
您可以尝试使用ojdbc14 _g的.jar而不是ojdbc14.jar的作为它的类用“的javac -g”,并包含一些跟踪信息编制。
你也可以尝试更新的驱动程序 。
您可以使用rs.getBigDecimal(columnIndex)
和从大小数,你可以得到特定的列的精度/标度值。
不是直接回答你的问题,但你提到的解决方法:
如果你所要做的就是检查或比较DB模式,然后代替的ResultSetMetaData和查询所有的表都使用Oracle模式信息中描述的逆向工程数据模型 。 我用它在我的工具这些信息导出到文本