Libreria di parser SQL per Java [chiuso]


141

Esiste una libreria Java open source per l'analisi delle istruzioni SQL?

Se possibile, dovrebbe essere personalizzabile o abbastanza flessibile da poter analizzare (o almeno ignorare) la sintassi specifica del fornitore (come le definizioni del tablespace Oracle o la clausola LIMIT di MySQL).

In caso contrario, anche la stretta aderenza allo standard SQL va bene.

Aggiornamento: ho bisogno di questo per due cose:

  • fornire un'interfaccia SQL a un database non SQL (mappatura a chiamate API interne)
  • riscrivere SQL prima che passi al database effettivo (ad es. Oracle)

109
in che modo questa domanda non è costruttiva? cosa c'è che non va in te, Stackoverflow?
anton1980,

11
Questa domanda dovrebbe essere riaperta. Inoltre, found foundationdb.github.io/sql-parser
kervin

2
Questo è off-topic: le richieste di librerie, strumenti, tutorial e altre risorse off-site non sono considerate on-topic per StackOverflow.
Toby Speight,

Penso che questo dovrebbe essere chiesto su un altro sito SE
Peterchaula il

4
Penso che questa domanda sia costruttiva !!
Casualet,

Risposte:


51

ANTLR3 ha una grammatica SQL ANSI disponibile. Puoi usarlo per creare il tuo parser.

ANTLR4 ha una grammatica SQL .


5
Perché usare ANTLR quando è possibile implementare il proprio generatore di parser?
IAdapter,

127
Perché generare il proprio generatore di parser quando è possibile utilizzare ANTLR?
duffymo,

Qualche link su come si può usare Antlr SQL Grammar per analizzare queste query? Ho esaminato la grammatica di alcuni parser PL / SQL, nonché i Lexer e i parser, ma non sono riuscito a capire come usarne uno. Gradirei qualsiasi link.
Abhishek,

Nutri la grammatica in ANTLR, che sputa le classi lexer / parser che dovrai quindi compilare ed eseguire. La migliore fonte che mi viene in mente è il riferimento ANTLR: amazon.com/…
duffymo

Adesso siamo in ANTLR 4. Forse le vecchie grammatiche non funzionano sulla nuova versione.
Duffymo,

34
  • JSqlParser
  • Il parser di Presto è scritto usando ANTLR4 e ha le sue classi AST immutabili che sono costruite dal parser. L'AST ha un visitatore e una bella stampante.

Ho una domanda per Presto, se ho istruzione Statement = SQL_PARSER.createStatement (query); Come posso ottenere il corpo della query, ovvero i valori Seleziona, Da, Dove, ecc.?
quark

L'istruzione è una classe di base. Un'istruzione SELECT sarà di tipo Query. Contiene un QueryBody che ha la sottoclasse QuerySpecification. La struttura è più complessa di quanto ci si possa aspettare per supportare UNION, TABLE, VALUES, impostare operazioni, ecc. È possibile creare un visitatore estendendo AstVisitor o DefaultTraversalVisitor. Guarda SqlFormatter per un esempio di come camminare l'albero.
David Phillips,

Sarebbe possibile ottenere la struttura ad albero delle query da una determinata query utilizzando Presto?
MockedMan.Object

Non sono sicuro di quello che stai chiedendo. Puoi creare una nuova domanda con maggiori dettagli?
David Phillips,

9

parser

Se hai bisogno di un parser, dovrebbe esserci un parser nella base di codice di Apache Derby .

Gestione di SQL specifici del fornitore

Potresti voler esaminare il metodo .native () sull'oggetto Connessione jdbc, al quale puoi passare query neutre del fornitore che verranno postelaborate in query specifiche del fornitore.


Quel metodo nativo () sembra interessante. Ci sono esempi su come può essere usato? Che tipo di conversioni sono possibili lì?
Thilo,

@Thilo, ad esempio SQL Server 2014, metodo nativeSQL (SQLServerConnection) : "Questo metodo non è attualmente supportato dal driver JDBC di Microsoft per SQL Server."
Gerold Broser,

@Thilo OracleConnectionWrapper di OJDBC sembra supportarlo.
Gerold Broser,


5

Prova Zql


4
zql è utile per le query di base ma quando si tenta di analizzare una query che contiene l'istruzione join, viene espulsa. quindi non lo consiglio
zato

3

Hibernate utilizza ANTLR per l'analisi sql e hql.

Anche JSqlParser è una buona opzione, anche se ha alcuni bug (o alcune funzionalità non implementate) durante l'analisi di Oracle pl / sql. vedere il suo forum per i dettagli.

quindi se stai analizzando oracle pl / sql, si consiglia ANTLR.


tra l'altro, anltr è sotto BSD.
Han Zheng,

2

Cosa vuoi fare con l'SQL analizzato? Posso consigliare alcune implementazioni Java di Lex / Yacc ( BYACC / J , Java Cup ) con le quali è possibile utilizzare una grammatica SQL esistente.

Se vuoi davvero fare qualcosa con la grammatica analizzata risultante, potrei suggerire di guardare Derby , un database SQL open source scritto in Java.


Il parser SQL utilizzato in Derby è disponibile come JAR indipendente?
Lluis Martinez,

1
Non lo so. Non ho mai cercato la fonte di Derby.
Thomas Jones-Low,

1
Ora conosco la risposta a questa domanda: No, il parser SQL per Derby non è un progetto separato. Dovrai separarlo per usarlo per qualcosa di diverso da Derby.
Thomas Jones-Low

1
Sono tornato di nuovo dopo 10 anni :-)
Lluis Martinez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.