SQL-Parser-Bibliothek für Java [geschlossen]

140

Gibt es eine Open-Source-Java-Bibliothek zum Parsen von SQL-Anweisungen?

Wenn möglich, sollte es anpassbar oder flexibel genug sein, um auch herstellerspezifische Syntax (wie Oracle-Tablespace-Definitionen oder die LIMIT-Klausel von MySQL) analysieren (oder zumindest ignorieren) zu können.

Wenn nicht, ist auch die strikte Einhaltung des SQL-Standards in Ordnung.

Update: Ich brauche das für zwei Dinge:

  • Bereitstellung einer SQL-Schnittstelle für eine Nicht-SQL-Datenbank (Zuordnung zu internen API-Aufrufen)
  • Umschreiben von SQL, bevor es in die eigentliche Datenbank (z. B. Oracle) wechselt
Thilo
quelle
109
Wie ist diese Frage nicht konstruktiv? Was ist los mit dir, Stackoverflow?
anton1980
11
Diese Frage sollte erneut geöffnet werden. Auch gefunden Foundationdb.github.io/sql-parser
Kervin
2
Dies ist nicht zum Thema gehörend - Anfragen nach Bibliotheken, Tools, Tutorials und anderen externen Ressourcen werden für StackOverflow nicht als themenbezogen betrachtet.
Toby Speight
Ich denke, dies sollte auf einer anderen SE-Seite gefragt werden
Peterchaula
4
Ich finde diese Frage konstruktiv !!
Casualet

Antworten:

51

ANTLR3 verfügt über eine ANSI-SQL-Grammatik. Damit können Sie Ihren eigenen Parser erstellen.

ANTLR4 hat eine SQL-Grammatik .

Duffymo
quelle
5
Warum ANTLR verwenden, wenn Sie Ihren eigenen Parser-Generator implementieren können?
IAdapter
127
Warum einen eigenen Parser-Generator generieren, wenn Sie ANTLR verwenden können?
Duffymo
Gibt es Links dazu, wie man Antlr SQL Grammatik verwenden kann, um diese Abfragen zu analysieren? Ich habe mir die Grammatik einiger PL / SQL-Parser sowie Lexer und Parser angesehen, konnte aber nicht verstehen, wie man einen verwendet. Würde mich über Links freuen.
Abhishek
Sie geben die Grammatik an ANTLR weiter, das die Lexer / Parser-Klassen ausspuckt, die Sie dann kompilieren und ausführen. Die beste Quelle, die ich mir
vorstellen
Wir sind jetzt bei ANTLR 4. Vielleicht laufen die alten Grammatiken nicht auf der neuen Version.
Duffymo
34
  • JSqlParser
  • Der Parser von Presto wird mit ANTLR4 geschrieben und verfügt über eigene unveränderliche AST-Klassen, die aus dem Parser erstellt werden. Der AST hat einen Besucher und einen hübschen Drucker.
David Phillips
quelle
Ich habe eine Frage an Presto: Wenn ich eine Anweisungsanweisung habe = SQL_PARSER.createStatement (Abfrage); Wie kann ich den Abfragetext abrufen, dh die Werte Auswählen, Von, Wo usw.?
Quarks
Anweisung ist eine Basisklasse. Eine SELECT-Anweisung ist vom Typ Query. Es enthält einen QueryBody mit der Unterklasse QuerySpecification. Die Struktur ist komplexer als erwartet, um UNION, TABLE, VALUES, Set-Operationen usw. zu unterstützen. Sie können einen Besucher erstellen, indem Sie AstVisitor oder DefaultTraversalVisitor erweitern. In SqlFormatter finden Sie ein Beispiel für das Gehen auf dem Baum.
David Phillips
Wäre es möglich, die Abfragebaumstruktur aus einer bestimmten Abfrage mit Presto abzurufen?
MockedMan.Object
Ich bin mir nicht sicher, was du fragst. Können Sie eine neue Frage mit mehr Details erstellen?
David Phillips
9

Parser

Wenn Sie einen Parser benötigen, sollte sich in der Codebasis von Apache Derby ein Parser befinden .

Umgang mit herstellerspezifischem SQL

Möglicherweise möchten Sie sich die .native () -Methode für das jdbc-Verbindungsobjekt ansehen, mit der Sie herstellerneutrale Abfragen übergeben können, die in herstellerspezifische Abfragen nachbearbeitet werden.

Elijah
quelle
Diese native () Methode sieht interessant aus. Gibt es Beispiele, wie es verwendet werden kann? Welche Art von Konvertierungen sind dort möglich?
Thilo
@Thilo zB SQL Server 2014, nativeSQL-Methode (SQLServerConnection) : "Diese Methode wird derzeit vom Microsoft JDBC-Treiber für SQL Server nicht unterstützt."
Gerold Broser
Der OracleConnectionWrapper von @Thilo OJDBC scheint dies zu unterstützen.
Gerold Broser
5

Versuchen Sie es mit Zql

Jagamotte
quelle
4
zql eignet sich für grundlegende Abfragen. Wenn Sie jedoch versuchen, eine Abfrage zu analysieren, die eine Join-Anweisung enthält, wird sie in die Luft gesprengt. also schlage ich es nicht vor
zato
3

Hibernate verwendet ANTLR für die Analyse von SQL und SQL.

JSqlParser ist auch eine gute Option. Es gibt jedoch einige Fehler (oder einige Funktionen, die nicht implementiert sind) beim Parsen von Oracle pl / sql. Einzelheiten finden Sie im Forum.

Wenn Sie also Oracle pl / sql analysieren, wird ANTLR empfohlen.

Han Zheng
quelle
Übrigens steht anltr unter BSD.
Han Zheng
2

Was möchten Sie mit dem analysierten SQL tun? Ich kann einige Java-Implementierungen von Lex / Yacc ( BYACC / J , Java Cup ) empfehlen , mit denen Sie eine vorhandene SQL-Grammatik verwenden können.

Wenn Sie tatsächlich etwas mit der resultierenden analysierten Grammatik anfangen möchten, empfehle ich Ihnen Derby , eine in Java geschriebene Open-Source-SQL-Datenbank.

Thomas Jones-Low
quelle
Ist der in Derby verwendete SQL-Parser als unabhängige JAR verfügbar?
Lluis Martinez
1
Ich weiß es nicht. Ich habe noch nie nach Derby gesucht.
Thomas Jones-Low
1
Ich kenne jetzt die Antwort auf diese Frage: Nein, der SQL-Parser für Derby ist kein separates Projekt. Sie müssen es auseinander ziehen, um es für etwas anderes als Derby zu verwenden.
Thomas Jones-Low
1
Ich kam nach 10 Jahren wieder zurück :-)
Lluis Martinez