我使用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
  • getPrecisiongetScale 是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_columnsall_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架构的信息中所描述 反向工程一个数据模型.我用它在我的用于出口这类信息的来文

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top