Java Oracle结果元数据getPrecision/getScale

Java Oracle结果元数据getPrecision/getScale,java,oracle,jdbc,thin,Java,Oracle,Jdbc,Thin,我正在使用Oracle的JDBC瘦驱动程序(10.2.0.3)连接到Oracle 10g数据库。我想获得有关数据库列的信息,所以我使用。我需要的最重要的信息是列的类型和长度,所以我使用了,和方法 如果列类型是“简单”的,如VARCHAR2(50)、数字(5)、数字(6,2),则它适用于简单查询(select*fromtablename)。如果我有一个更复杂的查询(select count(*)from tablename),或者一个基于包含一些复杂计算的视图的查询,这些方法会给出奇怪的结果,如:

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

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

  • getScale
    :-127
  • getPrecision
    getScale
    均为0
  • getPrecision
    :-1
oracle.jdbc.j2ee13 compliant
连接属性设置为
true
(如多个网页所建议的)可以消除getScale=-127,但仍然返回0/0结果


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

另一种方法是查询
用户选项卡列
所有选项卡列

可以接受0分制:数字(5)与数字(5,0)相同


但是,定义精度时,精度必须是介于1和38之间的整数。当它未定义时(如数字),驱动程序必须返回某些内容,因为它不能返回null。在这种情况下,驱动程序选择返回0。

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


如果您所要做的只是检查或比较db模式,则使用Oracle模式信息代替ResultSetMetaData并查询所有表,如中所述。我在我的实用程序中使用它将此类信息导出到文本

在我看来,似乎没有关于ResultSetMetaData的全面文档。 并给出了关于列名和类型的示例,它们不涉及其他方面

几年前有人和PostgreSQL打过交道,他做了一个补丁。也许Oracle在这里使用相同的代码库

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


您也可以尝试。

您可以使用
rs.getBigDecimal(columnIndex)
并从大小数中获得特定列的精度/刻度值。

Oracle无法基于视图或
计数(*)返回类型,因为它没有明确声明。根据视图的参考底图表,视图可以返回任何精度或比例

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

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

我知道这些桌子,但恐怕这不是一个太好的选择。只有在没有其他解决方案的情况下,我才会使用它。那么precision==0意味着precision==unmitied?