DatabaseMetaData.getColumns返回同义词的空ResultSet

时间:2013-08-31 07:20:35

标签: java oracle jdbc

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

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

其他SQL服务器是否也会发生这种情况?

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

2 个答案:

答案 0 :(得分:9)

默认情况下,Oracle驱动程序不会返回getColumns()中有关同义词的信息。这在Performance Extensions下的Oracle 11g JDBC开发人员指南中有记录:

  

getColumns的注意事项

     

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

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

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

     

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

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

答案 1 :(得分:1)

使用这种方式

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));