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
getPrecision
和 getScale
都是 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_columns
或all_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???????????????