3

我正在使用 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
  • 两者getPrecision都是getScale0
  • getPrecision:-1

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

很可能我必须为这些奇怪的结果创建一个解决方法,但首先我至少需要一份关于 Oracle ResultSetMetaData 行为的综合文档。例如,对于所有 SQL 类型,具有 getPrecision/getScale 含义的巨大表会很棒。某处有这样的文档吗?

4

6 回答 6

1

另一种方法是查询user_tab_columnsall_tab_columns

于 2009-09-11T12:28:48.870 回答
1

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

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

于 2009-09-11T12:30:00.050 回答
1

在我看来,没有关于 ResultSetMetaData 的全面文档。 Oracle® Database JDBC Developer's Guide and Reference 10g 第 2 版 (10.2)11g 第 2 版 (11.2)在这里给出了关于列名和类型的示例,它们不涉及其他方面。

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

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

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

于 2009-09-16T09:40:42.677 回答
1

您可以使用rs.getBigDecimal(columnIndex)and from the big decimal 获取特定列的精度/比例值。

于 2012-11-27T04:41:58.910 回答
1

Oracle 不能返回基于视图的类型,或者count(*)因为它没有显式声明。您的视图可以根据视图的底层表返回任何精度或比例。

要克服这个问题,您需要在查询或视图中转换类型,如下所示:

select CAST (count(*) AS NUMBER(30))
于 2014-03-12T22:08:24.643 回答
0

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

如果您所要做的只是检查或比较 db 模式,那么使用 Oracle 模式信息而不是 ResultSetMetaData 并查询所有表,如Reverse Engineering a Data Model中所述。我在我的实用程序中使用它来将此类信息导出为文本

于 2009-09-11T12:39:43.790 回答