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
  • getPrecisiongetScale都是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_columnsall_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模式信息。 我在我的实用程序中使用它将此类信息导出到文本