Oracle ResultSetMetaData getPrecision / getScale
我使用Oracle的JDBC瘦驱动程序(10.2.0.3)连接到Oracle 10g数据库。 我想获得有关数据库列的信息,因此我使用ResultSetMetaData 。 我需要的最重要的信息是列的类型和长度,所以我使用getColumnType , getPrecision和getScale方法。
如果列类型为“简单”,如VARCHAR2(50), NUMBER(5), NUMBER(6,2)
它适用于简单查询( 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行为的综合文档。 例如,对于所有SQL类型而言,具有getPrecision / getScale含义的巨大表将是很棒的。 某处有这样的文档吗?
Oracle无法基于视图或count(*)
返回类型,因为它未显式声明。 您的视图可以返回任何精度或比例,具体取决于视图的底层表。
要解决此问题,您需要在查询或视图中强制转换类型,如下所示:
select CAST (count(*) AS NUMBER(30))
另一种方法是查询user_tab_columns
或all_tab_columns
。
可以接受0的刻度:NUMBER(5)与NUMBER(5,0)相同
但是,定义时,精度必须是1到38之间的整数。 当它未定义时,如在NUMBER中,驱动程序必须返回一些东西,因为它不能返回null。 在这种情况下,驾驶员选择返回0。
在我看来,没有关于ResultSetMetaData的全面文档。 Oracle®数据库JDBC开发人员指南和参考10g第2版(10.2)和11g第2版(11.2)提供了有关列名称和类型的示例,它们不涉及其他方面。
几年前有人和PostgreSQL 有类似的问题 ,他做了补丁。 也许Oracle在这里使用相同的代码库。
您可以尝试使用ojdbc14 _g .jar而不是ojdbc14.jar,因为它的类使用“javac -g”编译并包含一些跟踪信息。
您也可以尝试更新的驱动程序 。
您可以使用rs.getBigDecimal(columnIndex)
,从大小数中可以获得特定列的精度/比例值。
不是直接回复您的问题,而是您提到的解决方法:
如果您要做的只是检查或比较数据库模式,那么代替ResultSetMetaData并查询所有表,使用反向工程数据模型中所述的Oracle模式信息。 我在我的实用程序中使用它将此类信息导出到文本