我正在使用Oracle的JDBC瘦驱动程序(10.2.0.3)连接到Oracle 10g数据库。我想获得有关数据库列的信息,因此我使用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行为的综合文档。例如,对于所有SQL类型而言,具有getPrecision / getScale含义的巨大表格将非常棒。在某个地方有这样的文档吗?
答案 0 :(得分:1)
另一种方法是查询user_tab_columns
或all_tab_columns
。
答案 1 :(得分:1)
比例为0是可接受的:NUMBER(5)与NUMBER(5,0)相同
但是,定义时,精度必须是1到38之间的整数。当它未定义时,如在NUMBER中,驱动程序必须返回一些东西,因为它不能返回null。在这种情况下,驾驶员选择返回0。
答案 2 :(得分:1)
在我看来,没有关于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。
答案 3 :(得分:1)
您可以使用rs.getBigDecimal(columnIndex)
,从大小数中可以获得特定列的精度/比例值。
答案 4 :(得分:1)
Oracle无法基于视图或count(*)
返回类型,因为它未显式声明。您的视图可以返回任何精度或比例,具体取决于视图的底层表。
要解决此问题,您需要在查询或视图中强制转换类型:
select CAST (count(*) AS NUMBER(30))
答案 5 :(得分:0)
不是对您的问题的直接回复,而是您提到的解决方法:
如果您只需要检查或比较数据库模式,那么请使用Oracle Reverse Engineering a Data Model中所述的Oracle模式信息来代替ResultSetMetaData并查询所有表。我在我的实用程序中使用它将此类信息导出到文本