Oracle ResultSetMetaData getPrecision / getScale

时间:2009-09-11 11:01:56

标签: java oracle jdbc thin

我正在使用Oracle的JDBC瘦驱动程序(10.2.0.3)连接到Oracle 10g数据库。我想获得有关数据库列的信息,因此我使用ResultSetMetaData。我需要的最重要的信息是列的类型和长度,因此我使用getColumnTypegetPrecisiongetScale方法。

如果列类型像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含义的巨大表格将非常棒。在某个地方有这样的文档吗?

6 个答案:

答案 0 :(得分:1)

另一种方法是查询user_tab_columnsall_tab_columns

答案 1 :(得分:1)

比例为0是可接受的:NUMBER(5)与NUMBER(5,0)相同

但是,定义时,精度必须是1到38之间的整数。当它未定义时,如在NUMBER中,驱动程序必须返回一些东西,因为它不能返回null。在这种情况下,驾驶员选择返回0。

答案 2 :(得分:1)

在我看来,没有关于ResultSetMetaData的全面文档。 Oracle® Database JDBC Developer's Guide and Reference 10g Release 2 (10.2)11g Release 2 (11.2)提供了有关列名称和类型here的示例,但它们并未涉及其他方面。

几年前有人用PostgreSQL a similar problem做了一个补丁。也许Oracle在这里使用相同的代码库。

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

您也可以尝试newer drivers

答案 3 :(得分:1)

您可以使用rs.getBigDecimal(columnIndex),从大小数中可以获得特定列的精度/比例值。

答案 4 :(得分:1)

Oracle无法基于视图或count(*)返回类型,因为它未显式声明。您的视图可以返回任何精度或比例,具体取决于视图的底层表。

要解决此问题,您需要在查询或视图中强制转换类型:

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

答案 5 :(得分:0)

不是对您的问题的直接回复,而是您提到的解决方法:

如果您只需要检查或比较数据库模式,那么请使用Oracle Reverse Engineering a Data Model中所述的Oracle模式信息来代替ResultSetMetaData并查询所有表。我在我的实用程序中使用它将此类信息导出到文本