DatabaseMetaData.getColumns返回同义词的空ResultSet

元数据上的方法getColumns()返回一个空的ResultSet用于同义词(对于表和视图,它正确地返回列列表)。

这种情况发生在Oracle 11g Express上并使用最新的Oracle JDBC驱动程序(11.2.3)。

这也适用于其他SQL服务器吗?

欢迎任何帮助/想法来解决这个问题。

默认情况下,Oracle驱动程序不会返回getColumns()有关同义词的信息。 这在Performance Extensions下的Oracle 11g JDBC Developer’s Guide中有记录:

getColumns的注意事项

默认情况下,如果指定了同义词,则getColumns方法不会检索有关列的信息。 要在指定同义词时启用信息检索,必须在连接上调用setIncludeSynonyms方法,如下所示:

 ( (oracle.jdbc.driver.OracleConnection)conn ).setIncludeSynonyms(true) 

这将导致连接上的所有后续getColumns方法调用都包含同义词。 这与setRemarksReporting类似。 或者,您可以设置includeSynonyms连接属性。 这类似于remarksReporting连接属性。

但是,请记住,如果includeSynonyms为true,则table_name列中返回的对象的名称将是同义词名称(如果存在同义词)。 即使将表名传递给getColumns也是如此。

请注意,最后一项非常重要,请记住!

用这种方式

 PreparedStatement pt=coneection.preparestatement("select * from table_name"); Resultset rs=pt.executeQuery(); ResultsetMetaData rsmd=rs.getMetaData(); System.out.println(rsmd.getColumnName(coulmn_number)); System.out.println(rsmd.getColumnType(column_number)); 

其他方式

 PreparedStatement pt=coneection.preparestatement("select * from table_name"); Resultset rs=pt.executeQuery(); ResultsetMetaData rsmd=pt.getMetaData(); System.out.println(rsmd.getColumnName(coulmn_number)); System.out.println(rsmd.getColumnType(column_number));