Oracle ResultSetMetaData getPrecision/getScale
题
我使用Oracle JDBC薄司机(10.2.0.3)用于连接到一个Oracle10g数据库。我想得到的信息有关的数据库列,所以我用 ResultSetMetaData.最重要的信息我需要的是这种类型的列和长度,所以我用 getColumnType, getPrecision, , getScale 方法。
它适用于一个简单的查询(select * from tablename
)如果列类型是"简单的"喜欢 VARCHAR2(50), NUMBER(5), NUMBER(6,2)
.如果我有一个更复杂的查询(select count(*) from tablename
)或查询的基础上查看,其中包含一些复杂的计算,该方法得到奇怪的结果,如:
getScale
: -127- 既
getPrecision
和getScale
是0 getPrecision
: -1
设置 oracle.jdbc.J2EE13Compliant
连接到酒店 true
(作为建议的几个网页)消除getScale=-127的,但仍然返回0/0的结果。
最有可能我必须创建一个解决办法对于这些奇怪的结果,但首先我需要至少一个全面的文档有关的行为Oracle ResultSetMetaData.例如一个巨大的桌的意义getPrecision/getScale所有SQL类型将是巨大的。是否有一个文件像这样的地方吗?
解决方案
Oracle不能返回一类型的基础上一视或 count(*)
因为它不是明确声明。您看可以返回的任何精度或规模取决于垫层表的看法。
为了克服这个,你会需要投输入您的查询,或查看是这样的:
select CAST (count(*) AS NUMBER(30))
其他提示
另一种方法是查询 user_tab_columns
或 all_tab_columns
.
一个规模0是可以接受的:一些(5)同一作为一个数字(的5.0)
精密但是必须是一个整数1之间和38当它被定义。当它是不确定的,在数量、驾驶员已经返回的东西因为它无法返回null。在这种情况下,司机选择返回0.
在我看来,没有全面的文件ResultSetMetaData.Oracle数据库JDBC开发指南和参考10g释放2(10.2) 和 11g释放2(11.2) 给出的实例有关列名和类型 在这里,, 他们不处理其他方面。
有人 一个类似的问题 与PostgreSQL年前他做了一个修补程序。也许Oracle使用相同的代码这里。
你可以尝试使用ojdbc14_g.罐子,而不是的ojdbc14.jar 作为其课程进行了汇编与"javac-g",并包含了一些追踪的信息。
你也可以试试 更新的驱动程序.
你可以使用 rs.getBigDecimal(columnIndex)
和大小数可以获得精密的规模值的特定列。
不直接回答你的问题,而是一个解决方法你提到:
如果你所要做的就是检查或比较db架构,而不是ResultSetMetaData和查询所有表格中使用Oracle架构的信息中所描述 反向工程一个数据模型.我用它在我的用于出口这类信息的来文