我有一个使用各种连接的查询,我只需要此查询返回的列列表。我在java中完成它,通过只询问一行rownum = 1并获取值的列名。问题是如果该查询没有返回数据。
对于前。
select * from something
如果此查询返回任何数据,则会返回col1
,col2
,col3
。
但是,如果此查询没有返回任何数据,则会抛出错误。
我需要的是
我有什么方法可以运行
desc (select * from something)
或类似获取查询返回的列列表。
它可以在sql或JAVA中。这两种方法都可以接受。
在我的应用程序中,用户传递查询,我可以为查询添加包装器,但我无法完全修改它。
申请流程
来自用户的查询 - >通过java执行并获取一行 - >返回结果集中列的列表。
答案 0 :(得分:4)
您可以使用结果集的ResultSetMetaData
例如:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int countOfColumns = rsmd.getColumnCount();
for(int i = 1; i <= countOfColumns ; i++ )
System.out.println(rsmd.getColumnName(i));
答案 1 :(得分:0)
您可以将查询转换为视图,然后可以通过查询user_tab_columns查看视图中的列
select * from user_tab_columns
答案 2 :(得分:0)
对于所有用户拥有的表,info_schema.COLUMNS的Oracle等效项对于当前用户拥有的表是USER_TAB_COLS,ALL_TAB_COLS或DBA_TAB_COLS。
表空间不等同于模式,也不必提供表空间名称。
如果要为特定用户拥有的列OF表查询ALL_TAB_COLS或DBA_TAB_COLS,则提供架构/用户名将是有用的。在你的情况下,我想象查询看起来像:
String sqlStr= "
SELECT column_name
FROM all_tab_cols
WHERE table_name = 'users'
AND owner = ' || +_db+ || '
AND column_name NOT IN ( 'password', 'version', 'id' )
"
请注意,使用此方法可能会导致SQL注入。