我想知道是否有办法返回在我实际执行查询时生成的结果集(Oracle数据库,在Java中)的列名。例如,假设我的SQL看起来像这样:
select * from <complex table join>;
有没有办法将此查询发送到oracle,让它告诉我结果集中的列名是什么,它将返回而不实际执行查询(因为它很昂贵)?
答案 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';
可能是你的意思..但它仍然是一个查询...只是查询应用程序表而不是查询特殊表
与请求元数据的答案相同