имена столбцов для ad-hoc sql

Моя программа получит ввод действительного sql и должна вернуть имена столбцов для sql. И я хочу сделать это вообще без выполнения инструкции sql. Я ищу решение для Java.

Моя СУБД oracle оптимизирована для olap, а таблицы настолько велики, что ограничение набора результатов не работает. На самом деле время выполнения неприемлемо для моего случая. это занимает больше минуты


person dursun    schedule 09.02.2012    source источник
comment
возможный дубликат: stackoverflow.com/questions/660609/sql- parser-library-for-java, вы ищете синтаксический анализатор sql, который дает вам имена столбцов из запроса   -  person oers    schedule 09.02.2012
comment
синтаксический анализ - это один из вариантов, но моя главная задача - не ограничивать синтаксический анализ.   -  person dursun    schedule 09.02.2012
comment
Если вы не хотите выполнять sql, вам нужно проанализировать строку, представляющую запрос. Вам нужно интерпретировать эту строку как sql-запрос, и это делается путем применения к ней грамматики --> синтаксического анализа.   -  person oers    schedule 09.02.2012
comment
Вы говорите, что у меня нет другого выбора, кроме как разобрать его? Как dbms создает план выполнения? может это решение?   -  person dursun    schedule 09.02.2012
comment
Разумеется, у СУБД есть собственный анализатор грамматики sql. Я предположил, что под невыполнением вы имели в виду: я вообще не хочу взаимодействовать с базой данных. В зависимости от вашей базы данных вы можете установить параметры избежать выполнения, выполнить запрос и получить пустой результирующий набор. Или используйте какую-либо функциональность limit 1. Но это все зависит от базы данных.   -  person oers    schedule 09.02.2012
comment
моя СУБД оптимизирована для OLAP, а таблицы настолько велики, что ограничение набора результатов не работает. На самом деле время выполнения неприемлемо для моего случая. это занимает больше минуты.   -  person dursun    schedule 09.02.2012
comment
Без базы данных sql — это просто строка. Вам нужно разобрать это.   -  person oers    schedule 09.02.2012
comment
Хорошо, я могу использовать базу данных, но я не хочу, чтобы моя БД выполняла запрос. есть решение?   -  person dursun    schedule 09.02.2012


Ответы (1)


Подготовьте запрос, но вместо его выполнения просто вызовите getMetaData в подготовленном операторе. Если ваш драйвер поддерживает это, это должно вернуть метаданные результирующего набора с описаниями столбцов без выполнения запроса.

person araqnid    schedule 09.02.2012
comment
Можете ли вы дать образец кода, потому что, на самом деле, он так не работает. - person dursun; 09.02.2012
comment
ResultSetMetaData rsmd = conn.prepareStatement(sql).getMetaData();, а затем rsmd.getColumnCount(), rsmd.getColumnName(1), rsmd.getColumnTypeName(1) и т. д. - person araqnid; 09.02.2012
comment
Я пропустил ваш комментарий о поддержке драйверов. Думаю драйвер в ojdbc14.jar не поддерживает. потому что я получил следующее исключение... java.sql.SQLException: дескриптор оператора не выполнен: .java:146) в oracle.jdbc.driver.OracleResultSetImpl.getMetaData(OracleResultSetImpl.java:135) в oracle.jdbc.driver.OraclePreparedStatement.getMetaData(OraclePreparedStatement.java:4049) - person dursun; 09.02.2012
comment
о, это расстраивает. В этом случае вы вполне можете застрять, оборачивая SELECT * FROM (....) x WHERE rownum < 1 вокруг запроса, который должен оптимизировать фактическое выполнение, но все же создавать метаданные набора результатов при его выполнении. - person araqnid; 09.02.2012