甲骨文的ResultSetMetaData getPrecision /的getScale(Orac

2019-08-05 03:37发布

我使用的是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
  • getPrecisiongetScale是0
  • getPrecision :-1

设置oracle.jdbc.J2EE13Compliant连接属性设置为true (由几个网页的建议)消除的getScale = -127,但仍返回0/0的结果。

最有可能我要创建这些奇怪的结果解决方法,但首先我至少需要有关Oracle的ResultSetMetaData行为的全面的文档。 例如与getPrecision /的getScale的所有SQL类型的含义的巨大表将是巨大的。 有没有这样一个地方的文档?

Answer 1:

Oracle无法返回基于视图或类型count(*)因为它没有明确声明。 你的观点可以返回取决于视图的垫层表的任何精度或小数。

为了克服这一点,你就需要转换类型在查询或查看这样的:

select CAST (count(*) AS NUMBER(30))


Answer 2:

另一种方法是查询user_tab_columnsall_tab_columns



Answer 3:

0分是可以接受的:一个数字(5)是相同的数字(5,0)

然而,精度必须在定义时1和38之间的整数。 当它是不确定的,如数量,驾驶员必须返回的东西,因为它不能返回null。 在这种情况下,驱动程序选择返回0。



Answer 4:

在我看来,有上的ResultSetMetaData没有全面的文档。 的Oracle®数据库JDBC开发人员指南与参考10g第2版(10.2)和11g第2版(11.2)给出例如关于列名和类型在这里 ,他们不与其他方面的处理。

有人有类似的问题,以前在PostgreSQL年,他做了一个补丁。 也许甲骨文在这里使用相同的代码库。

您可以尝试使用ojdbc14 _g的.jar而不是ojdbc14.jar的作为它的类用“的javac -g”,并包含一些跟踪信息编制。

你也可以尝试更新的驱动程序 。



Answer 5:

您可以使用rs.getBigDecimal(columnIndex)和从大小数,你可以得到特定的列的精度/标度值。



Answer 6:

不是直接回答你的问题,但你提到的解决方法:

如果你所要做的就是检查或比较DB模式,然后代替的ResultSetMetaData和查询所有的表都使用Oracle模式信息中描述的逆向工程数据模型 。 我用它在我的工具这些信息导出到文本



文章来源: Oracle ResultSetMetaData getPrecision/getScale