Библиотека парсера SQL для Java [закрыто]


142

Есть ли библиотека Java с открытым исходным кодом для анализа операторов SQL?

Если возможно, он должен быть настраиваемым или достаточно гибким, чтобы также иметь возможность анализировать (или, по крайней мере, игнорировать) синтаксис, зависящий от поставщика (например, определения табличных пространств Oracle или предложение LIMIT в MySQL).

Если нет, то строгое соблюдение стандарта SQL тоже нормально.

Обновление: мне это нужно для двух вещей:

  • предоставление интерфейса SQL для базы данных, отличной от SQL (сопоставление с внутренними вызовами API)
  • перезапись SQL до того, как он попадет в фактическую базу данных (например, Oracle)

111
как этот вопрос неконструктивный? что с тобой, Stackoverflow?
anton1980

11
Этот вопрос следует снова открыть. Также обнаружен foundationdb.github.io/sql-parser
kervin

2
Это не по теме - запросы библиотек, инструментов, руководств и других сторонних ресурсов не рассматриваются в StackOverflow.
Тоби Спейт

Думаю, об этом нужно спросить на другом сайте SE
peterchaula

4
Считаю этот вопрос конструктивным !!
Casualet

Ответы:


51

ANTLR3 имеет доступную грамматику ANSI SQL. Вы можете использовать это для создания собственного парсера.

В ANTLR4 есть грамматика SQL .


5
Зачем использовать ANTLR, если можно реализовать собственный генератор парсеров?
IAdapter

130
Зачем создавать собственный генератор парсеров, если можно использовать ANTLR?
duffymo

Любые ссылки на то, как можно использовать Antlr SQL Grammar для анализа этих запросов? Я просмотрел грамматику некоторых парсеров PL / SQL, а также лексеров и парсеров, но не смог понять, как их использовать. Буду признателен за любые ссылки.
Abhishek

Вы загружаете грамматику в ANTLR, который выделяет классы лексера / парсера, которые вы затем скомпилируете и запустите. Лучший источник, о котором я могу думать, - это ссылка ANTLR: amazon.com/…
duffymo

Мы подошли к ANTLR 4. Возможно, старые грамматики не работают в новой версии.
duffymo

34
  • JSqlParser
  • Парсер Presto написан с использованием ANTLR4 и имеет свои собственные неизменяемые классы AST, созданные на основе анализатора. В AST есть посетитель и симпатичный типограф.

У меня вопрос к Presto. Если у меня есть оператор Statement = SQL_PARSER.createStatement (query); Как я могу получить тело запроса, т.е. значения Select, From, Where и т. Д.?
кварки

Заявление - это базовый класс. Оператор SELECT будет иметь тип Query. Он содержит QueryBody, имеющий подкласс QuerySpecification. Структура более сложная, чем вы могли ожидать, чтобы поддерживать UNION, TABLE, VALUES, операции над наборами и т. Д. Вы можете создать посетителя, расширив AstVisitor или DefaultTraversalVisitor. Посмотрите на SqlFormatter пример того, как пройти по дереву.
Дэвид Филлипс

Можно ли получить древовидную структуру запроса из данного запроса с помощью Presto?
MockedMan.Object 01

Я не уверен, о чем вы спрашиваете. Можете ли вы создать новый вопрос с более подробной информацией?
Дэвид Филлипс

9

Парсер

Если вам нужен парсер, в базе кода Apache Derby должен быть парсер .

Работа с SQL, зависящим от поставщика

Возможно, вы захотите взглянуть на метод .native () в объекте jdbc Connection, который вы можете передать ему нейтральные к поставщику запросы, которые будут постобработаны в запросы конкретных поставщиков.


Этот метод native () выглядит интересно. Есть ли примеры того, как это можно использовать? Какие преобразования там возможны?
Тило

@Thilo, например, SQL Server 2014, метод nativeSQL (SQLServerConnection) : «Этот метод в настоящее время не поддерживается драйвером Microsoft JDBC для SQL Server».
Герольд Брозер

OracleConnectionWrapper @Thilo OJDBC, похоже, поддерживает его.
Герольд Брозер


5

Попробуйте Zql


4
zql хорош для базовых запросов, но когда вы пытаетесь разобрать запрос, содержащий оператор соединения, он взрывается. так что я не предлагаю это
зато

3

Hibernate использует ANTLR для синтаксического анализа sql и hql.

JSqlParser также является хорошим вариантом, хотя в нем есть некоторые ошибки (или некоторые функции, не реализованные) при синтаксическом анализе Oracle pl / sql. подробности см. на форуме.

поэтому, если вы разбираете oracle pl / sql, рекомендуется использовать ANTLR.


кстати, anltr находится под BSD.
Хан Чжэн

2

Что вы хотите делать с проанализированным SQL? Я могу порекомендовать несколько Java-реализаций Lex / Yacc ( BYACC / J , Java Cup ), с которыми вы можете использовать существующую грамматику SQL.

Если вы действительно хотите что-то сделать с полученной проанализированной грамматикой, я мог бы предложить взглянуть на Derby , базу данных SQL с открытым исходным кодом, написанную на Java.


Доступен ли анализатор SQL, используемый в Derby, как независимый JAR?
Луис Мартинес,

1
Я не знаю. Я никогда не смотрел на источник Дерби.
Томас Джонс-Лоу,

1
Теперь я знаю ответ на этот вопрос: нет, синтаксический анализатор SQL для Derby не является отдельным проектом. Вам нужно будет разобрать его, чтобы использовать для чего-то другого, кроме Дерби.
Томас Джонс-Лоу

1
Я вернулся через 10 лет :-)
Луис Мартинес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.