Oracle ResultSetMetaData getPrecision/getScale

Posted

技术标签:

【中文标题】Oracle ResultSetMetaData getPrecision/getScale【英文标题】: 【发布时间】:2009-09-11 11:01:55 【问题描述】:

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

如果列类型是“简单”,如VARCHAR2(50), NUMBER(5), NUMBER(6,2),它适用于简单查询 (select * from tablename)。如果我有更复杂的查询 (select count(*) from tablename) 或基于包含一些复杂计算的视图的查询,这些方法会给出奇怪的结果,例如:

getScale:-127 getPrecisiongetScale 都是 0 getPrecision:-1

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

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

【问题讨论】:

【参考方案1】:

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

要克服这个问题,您需要像这样在查询或视图中转换类型:

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

【讨论】:

【参考方案2】:

另一种方法是查询user_tab_columnsall_tab_columns

【讨论】:

我知道这些表,但恐怕这不是一个很好的选择。只有在没有其他解决方案的情况下,我才会使用它。【参考方案3】:

0 的刻度是可接受的:NUMBER(5) 与 NUMBER(5,0) 相同

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

【讨论】:

所以precision==0表示precision==unlimited?【参考方案4】:

在我看来,没有关于 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。

【讨论】:

【参考方案5】:

您可以使用rs.getBigDecimal(columnIndex) 并从大十进制中获取特定列的精度/比例值。

【讨论】:

【参考方案6】:

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

如果您只需检查或比较 db 模式,则使用 Reverse Engineering a Data Model 中所述的 Oracle 模式信息代替 ResultSetMetaData 和查询所有表。我在我的实用程序中使用它来将此类信息导出为文本

【讨论】:

以上是关于Oracle ResultSetMetaData getPrecision/getScale的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 的 ucp.jar 应该驻留在 Tomcat 的 lib 还是应用程序的 war 中?缺少 ResultSetMetaData。使用 Oracle 实现 Tomcat 应用程序的干净重新

ResultSetMetaData.getColumnTypeName 返回 UNKNOWN

ResultSet相关ResultSetMetaData详细

ResultSetMetaData getTableName 返回空

???????????????ResultSetMetaData??????DBUtils???????????????

ResultSetMetaData中getColumnLabel和getColumnName的区别