2015-08-10 3 views
4

У меня есть запрос с использованием различных объединений, и мне просто нужен список столбцов, возвращаемых этим запросом. Я сделал это в java, задав только одну строку с rownum = 1 и получив имя столбца для значения. Проблема в том, что нет данных, возвращаемых этим запросом.Список столбцов в sql-запросе

Для примера.

select * from something 

и если есть какие-либо данные, возвращающиеся по этому запросу, то он будет возвращать col1, col2, col3. Но если нет данных, возвращаемых этим запросом, тогда он будет вызывать ошибку.

Что мне нужно

Есть ли способ, что я могу запустить

desc (select * from something) 

или подобное, чтобы получить список столбцов, возвращаемых запросом.

Это может быть в sql или JAVA. Оба метода приемлемы.

В моем приложении пользователь передает запрос, и я могу добавить оболочку к запросу, но я не могу полностью его изменить.

Поток приложения

запрос от пользователя -> выполнить с помощью Java и получить одну строку -> Список возврата столбцов в наборе результатов.

+0

'select * from something' will *** not ***" throw error ", если таблица не содержит никаких данных. Как и где вы работаете? –

+0

Запрос не будет вызывать ошибку. Но если я попытаюсь получить первую строку набора результатов, он будет генерировать ошибку, поскольку запись недоступна. –

+1

Нет, это будет ** не ** выдавать ошибку, если вы сделаете это правильно. Пожалуйста, покажите нам свой Java-код. –

ответ

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

Пробовал этот метод, спасибо, но 'rs' пуст, если нет записей. –

+0

@LaxmikantDange: даже если 'rs' пуст, вы все равно можете получить метаданные. –

+0

@KevalDalasaniya, It works, Thanks –

0

вы могли бы, возможно, преобразовать запрос на вид, вы можете увидеть столбцы в представлении, запрашивая user_tab_columns

select * from user_tab_columns 
0

эквивалент Oracle для информации_schema.COLUMNS - USER_TAB_COLS для таблиц, принадлежащих текущему пользователю, ALL_TAB_COLS или DBA_TAB_COLS для таблиц принадлежащих всем пользователям.

Табличное пространство не эквивалентно схеме, и вы не должны указывать имя табличного пространства.

Предоставление схемы/имени пользователя было бы полезно, если вы хотите запросить 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 инъекции.

+1

Если вы делаете это, вам нужно использовать значения TABLE_NAME и COLUMN_NAME. Он также не будет работать для произвольного запроса - это то, что пытается выполнить OP (обратите внимание на текст о JOINs в верхней части вопроса) – Ben

Смежные вопросы