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

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 .


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.

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.


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


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.


Ü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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.