7

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

select * from <complex table join>;

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

4

3 回答 3

14

我认为使用 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 上试过这个,它可以工作。

如果失败,您可以简单地将 a 附加where 1=0到查询并执行它。至少它不会返回所有行(可能也使用Statement.setMaxRows(),只是为了确定。

最后一个(但相当复杂的)选项是dbms_sql用来打开、准备和描述语句。详见手册: http: //docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm

于 2013-01-09T20:04:22.957 回答
2

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

  SELECT * from (
    <your query here>
  )
  WHERE 1=0
于 2013-01-09T20:10:11.537 回答
-1
    SELECT
      COLUMN_NAME
   FROM
      ALL_TAB_COLUMNS
   WHERE
      TABLE_NAME ='tableName';

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

与请求元数据的答案相同

于 2013-01-09T20:10:29.170 回答