仅返回ResultSet的列名而不实际执行查询(Oracle和Java)

时间:2013-01-09 19:58:39

标签: java oracle

我想知道是否有办法返回在我实际执行查询时生成的结果集(Oracle数据库,在Java中)的列名。例如,假设我的SQL看起来像这样:

select * from <complex table join>;

有没有办法将此查询发送到oracle,让它告诉我结果集中的列名是什么,它将返回而不实际执行查询(因为它很昂贵)?

3 个答案:

答案 0 :(得分:12)

我认为使用PreparedStatement可以起作用:

PreparedStatement stmt = connection.prepareStatement("select ...");
ResultSetMetaData meta = stmt.getMetaData();
for (int col=0; col < meta.getColumnCount(); col++) 
{
   System.out.println("Column: " + meta.getColumnName(col + 1));
}

(编辑):我尝试使用Oracle 11.2和驱动程序版本11.2.0.3并且它可以工作。

如果失败,您只需在查询中附加where 1=0然后执行即可。至少它不会返回所有行(也可能也使用Statement.setMaxRows(),只是为了确定。

最终(但相当复杂)的选项是使用dbms_sql来打开,准备和描述语句。有关详细信息,请参阅手册:http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm

答案 1 :(得分:2)

您可以尝试在外部选择中包装查询并添加1 = 0,以防止它获取任何行:

  SELECT * from (
    <your query here>
  )
  WHERE 1=0

答案 2 :(得分:-1)

    SELECT
      COLUMN_NAME
   FROM
      ALL_TAB_COLUMNS
   WHERE
      TABLE_NAME ='tableName';

可能是你的意思..但它仍然是一个查询...只是查询应用程序表而不是查询特殊表

与请求元数据的答案相同