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


141

Чи існує бібліотека Java з відкритим кодом для аналізу SQL-операторів?

Якщо це можливо, він повинен бути настроюваним або гнучким, щоб також можна було проаналізувати (або принаймні проігнорувати) синтаксис, що залежить від постачальника (наприклад, визначення таблиць простору Oracle або пункт обмеження MySQL LIMIT).

Якщо ні, то також чітке дотримання стандарту SQL.

Оновлення: мені це потрібно для двох речей:

  • надання інтерфейсу SQL до бази даних, що не належить до SQL (відображення внутрішніх дзвінків API)
  • перезапис SQL до того, як він перейде до фактичної бази даних (наприклад, Oracle)

109
як це питання не конструктивне? що з тобою, Стакковерф?
anton1980

11
Це питання слід знову відкрити. Також знайдено foundationdb.github.io/sql-parser
kervin

2
Це поза темою - запити для бібліотек, інструментів, навчальних посібників та інших ресурсів поза сайтом не вважаються тематичними для StackOverflow.
Toby Speight

Я думаю, що це слід запитати на іншому сайті SE
peterchaula

4
Я думаю, що це питання є конструктивним !!
Casualet

Відповіді:


51

У ANTLR3 доступна граматика ANSI SQL. Ви можете використовувати це для створення власного аналізатора.

ANTLR4 має граматику SQL .


5
Навіщо використовувати ANTLR, коли можна реалізувати власний генератор парсера?
IAdapter

127
Навіщо створювати власний генератор парсера, коли ви можете використовувати ANTLR?
duffymo

Будь-які посилання на те, як можна використовувати Antlr SQL Grammar для розбору цих запитів? Я переглянув граматику деяких PL / SQL Parsers, а також Lexers і Parsers, але не зміг зрозуміти, як її використовувати. Буду вдячний за будь-які посилання.
Абхішек

Ви подаєте граматику в ANTLR, яка виплющує класи лексерів / парсерів, які ви потім будете компілювати та запускати. Найкращим джерелом, про який я можу придумати, є посилання ANTLR: amazon.com/…
duffymo

Зараз ми до ANTLR 4. Можливо, старі граматики не працюють на новій версії.
duffymo

34
  • JSqlParser
  • Парсер Presto написаний за допомогою ANTLR4 і має власні непорушні класи AST, побудовані з аналізатора. У AST є відвідувач і симпатичний принтер.

У мене є питання щодо Presto, якщо у мене є заява Statement = SQL_PARSER.createStatement (query); Як я можу отримати тіло запиту, тобто значення Select, From, Where тощо?
кварків

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

Чи можна було б отримати структуру дерева запитів із заданого запиту за допомогою Presto?
MockedMan.Object

Я не впевнений, що ви просите. Чи можете ви створити нове запитання більш детально?
Девід Філліпс

9

Парсер

Якщо вам потрібен парсер, у кодовій базі Apache Derby повинен бути аналізатор .

Робота зі специфічним для постачальника SQL

Ви можете подивитися метод .native () на об’єкті jdbc Connection, який ви зможете передати йому нейтральні запити постачальника, які отримають після обробки в конкретних запитах постачальника.


Цей рідний () метод виглядає цікаво. Чи є приклади, як це можна використовувати? Які перетворення можливі там?
Тіло

@Thilo, наприклад, SQL Server 2014, метод nativeSQL (SQLServerConnection) : "Цей метод наразі не підтримується драйвером JDBC Microsoft для SQL Server."
Герольд Брозер

OracleConnectionWrapper @Thilo OJDBC, схоже, підтримує це.
Герольд Брозер


5

Спробуйте Zql


4
zql хороший для основних запитів, але коли ви намагаєтеся розібрати запит, який містить заяву приєднання, він підірветься. тому я не пропоную цього
тому

3

Hibernate використовує ANTLR для розбору sql та hql.

JSqlParser також є хорошим варіантом. Хоча він має деякі помилки (або деякі функції не реалізовані) під час розбору oracle pl / sql. детальніше дивіться на його форумі.

тому якщо ви розбираєте Oracle pl / sql, рекомендується ANTLR.


btw, anltr знаходиться під BSD.
Хань Чжен

2

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

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


Чи доступний аналізатор SQL, який використовується в Дербі, як незалежний JAR?
Lluis Martinez

1
Не знаю. Я ніколи не дивився на джерело Дербі.
Томас Джонс-Лоу

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

1
Я повернувся знову через 10 років :-)
Lluis Martinez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.