Java用SQLパーサーライブラリ[終了]


140

SQLステートメントを解析するためのオープンソースのJavaライブラリはありますか?

可能であれば、ベンダー固有の構文(Oracleテーブルスペース定義やMySQLのLIMIT句など)も解析(または少なくとも無視)できるように、カスタマイズ可能または柔軟である必要があります。

そうでない場合は、SQL標準に厳密に従うことも問題ありません。

更新:これは2つのことのために必要です:

  • 非SQLデータベースへのSQLインターフェースの提供(内部API呼び出しへのマッピング)
  • 実際のデータベース(Oracleなど)に移行する前にSQLを書き直す

109
この質問はどのように建設的ではないのですか?Stackoverflowの何が問題になっていますか?
— anton1980 2013

11
この質問は再開する必要があります。また、foundationdb.github.io
— sql

2
これはトピック外です-ライブラリ、ツール、チュートリアル、およびその他のオフサイトリソースのリクエストは、StackOverflowのトピックとは見なされません。
— Toby Speight 2016年

これは別のSEサイトで質問する必要があると思います
— peterchaula

4
この質問は建設的だと思います!!
— カジュアル

回答:


51

ANTLR3にはANSI SQL文法があります。これを使用して独自のパーサーを作成できます。

ANTLR4にはSQL文法があります。


5
独自のパーサージェネレーターを実装できるのに、なぜANTLRを使用するのですか?
— IAdapter 2010年

127
ANTLRを使用できるのに、なぜ独自のパーサージェネレーターを生成するのですか?
— duffymo

Antlr SQL文法を使用してこれらのクエリを解析する方法へのリンクはありますか?一部のPL / SQLパーサーのほか、レクサーとパーサーの文法を調べましたが、使用方法を理解することができませんでした。リンクをいただければ幸いです。
— Abhishek 2012年

文法をANTLRに渡します。ANTLRは、レクサー/パーサークラスを吐き出して、コンパイルして実行します。:私は考えることができる最高のソースはANTLRリファレンスですamazon.com/...
— duffymo

現在、ANTLR 4までです。おそらく、古い文法は新しいバージョンでは動作しません。
— duffymo 2013年

34
  • JSqlParser
  • PrestoのパーサーはANTLR4を使用して記述され、パーサーから構築された独自の不変のASTクラスを持っています。ASTにはビジターとプリティプリンターがあります。

Prestoに質問があります。Statementステートメントがある場合= SQL_PARSER.createStatement(query); クエリの本文、つまりSelect、From、Whereなどの値を取得するにはどうすればよいですか?
— クォーク

ステートメントは基本クラスです。SELECTステートメントはクエリタイプになります。サブクラスQuerySpecificationを持つQueryBodyが含まれています。構造は、UNION、TABLE、VALUES、集合演算などをサポートするために予想よりも複雑です。AstVisitorまたはDefaultTraversalVisitorを拡張してビジターを作成できます。ツリーのウォーク方法の例については、SqlFormatterを参照してください。
— David Phillips、

Prestoを使用して、特定のクエリからクエリツリー構造を取得することはできますか?
— MockedMan.Object

何を聞いているのかよくわかりません。より詳細な新しい質問を作成できますか?
— David Phillips

9

パーサー

パーサーが必要な場合は、Apache Derbyのコードベースにパーサーが必要です。です。

ベンダー固有のSQLを扱う

jdbc Connectionオブジェクトの.native()メソッドを確認すると、ベンダー固有のクエリに後処理されるベンダーニュートラルなクエリを渡すことができます。


そのnative()メソッドは興味深いようです。使い方の例はありますか?そこではどのような変換が可能ですか?
— ティロ

@Thilo例:SQL Server 2014、nativeSQLメソッド(SQLServerConnection):「このメソッドは現在、SQL Server用のMicrosoft JDBC Driverではサポートされていません。」
— Gerold Broser 2014

@Thilo OJDBCのOracleConnectionWrapperはそれをサポートしているようです。
— Gerold Broser 14


5

試してみてくださいZqlを


4
zqlは基本的なクエリには適していますが、joinステートメントを含むクエリを解析しようとすると失敗します。だから私はそれをお勧めしません
— zato

3

Hibernateはsqlとhqlの解析にANTLRを使用します。

JSqlParserも適切なオプションです。ただし、oracle pl / sqlの解析中にいくつかのバグ(または実装されていない機能)があります。詳細はフォーラムをご覧ください。

したがって、oracle pl / sqlを解析する場合は、ANTLRをお勧めします。


ところで、anltrはBSDの下にあります。
— Han Zheng

2

解析済みSQLで何をしたいですか?既存のSQL文法を使用できるLex / YaccのJava実装(BYACC / J、Java Cup)をいくつかお勧めします。

結果として得られる構文解析された文法を実際に使用したい場合は、Javaで作成されたオープンソースのSQLデータベースであるDerbyを検討することをお勧めします。


Derbyで使用されるSQLパーサーは、独立したJARとして使用できますか?
— Lluis Martinez

1
知りません。私はダービーのソースを見たことがありません。
— トーマスジョーンズ

1
私はこの質問に対する答えを知っています。いいえ、DerbyのSQLパーサーは独立したプロジェクトではありません。Derby以外で使用する場合は、プルする必要があります。
— トーマスジョーンズ-ロー

1
私は10年後にまた戻ってきました:-)
— Lluis Martinez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.