Java için SQL ayrıştırıcı kitaplığı [kapalı]


141

SQL deyimlerini ayrıştırmak için açık kaynaklı bir Java kütüphanesi var mı?

Mümkünse, satıcıya özgü sözdizimini (Oracle tablo alanı tanımları veya MySQL'in LIMIT yantümcesi gibi) ayrıştırabilecek (veya en azından göz ardı edebilecek) kadar özelleştirilebilir veya esnek olmalıdır.

Değilse, SQL standardına sıkı sıkıya bağlı kalmak da iyidir.

Güncelleme: İki şeye ihtiyacım var:

  • SQL dışı bir veritabanına SQL arabirimi sağlama (dahili API çağrılarıyla eşleme)
  • SQL'i gerçek veritabanına gitmeden önce yeniden yazma (ör. Oracle)

109
bu soru nasıl yapıcı değil? Senin sorunun ne, Stackoverflow?
anton1980

11
Bu soru yeniden açılmalıdır. Ayrıca, bulundu foundationdb.github.io/sql-parser
kervin

2
Bu konu dışıdır - kütüphaneler, araçlar, öğreticiler ve diğer site dışı kaynaklar için talepler StackOverflow için konu üzerinde değerlendirilmez.
Toby Speight

Bu başka bir SE sitesinde sorulması gerektiğini düşünüyorum
peterchaula

4
Bu sorunun yapıcı olduğunu düşünüyorum !!
Casualet

Yanıtlar:


51

ANTLR3 , bir ANSI SQL dilbilgisine sahiptir. Kendi ayrıştırıcıyı oluşturmak için bunu kullanabilirsiniz.

ANTLR4 bir SQL dilbilgisine sahiptir .


5
Kendi ayrıştırıcı jeneratörünüzü uygularken neden ANTLR kullanıyorsunuz?
IAdapter

127
ANTLR'yi kullanabildiğinizde neden kendi ayrıştırıcı oluşturucunuzu oluşturmalısınız?
duffymo

Herhangi bir bağlantı nasıl bu sorguları ayrıştırmak için Antlr SQL dilbilgisi kullanabilirsiniz? Bazı PL / SQL Parsers'ın yanı sıra Lexers ve Parsers'ın gramerine baktım, ancak nasıl kullanılacağını anlayamadım. Herhangi bir bağlantı için teşekkür ederiz.
Abhishek

Dilbilgisini, daha sonra derleyeceğiniz ve çalıştıracağınız lexer / ayrıştırıcı sınıflarını veren ANTLR'ye beslersiniz. Aklıma gelen en iyi kaynak ANTLR referansı: amazon.com/…
duffymo

Şimdi ANTLR 4'e geldik. Belki de eski gramerler yeni versiyonda çalışmaz.
duffymo

34

Ben Presto için bir sorum var, Ben Statement deyimi = SQL_PARSER.createStatement (sorgu) varsa; Sorgu gövdesini, örneğin Seç, Kimden, Nerede vb. Değerlerini nasıl alabilirim?
quarks

İfade temel bir sınıftır. SELECT ifadesi, Sorgu türünde olacaktır. QuerySpecification alt sınıfına sahip bir QueryBody içerir. Yapı, BİRLİĞİ, TABLO, DEĞERLERİ, ayarlanan işlemleri vb. Desteklemek için beklediğinizden daha karmaşıktır. Ağacın nasıl yürüyeceğine dair bir örnek için SqlFormatter'a bakın.
David Phillips

Presto kullanarak belirli bir sorgudan sorgu ağacı yapısını almak mümkün müdür?
MockedMan.Object

Ne istediğini bilmiyorum. Daha ayrıntılı yeni bir soru oluşturabilir misiniz?
David Phillips

9

Ayrıştırıcı

Bir ayrıştırıcıya ihtiyacınız varsa Apache Derby'nin kod tabanında bir ayrıştırıcı olmalıdır .

Satıcıya özgü SQL ile başa çıkmak

Sen bakmak isteyebilirsiniz .native () Eğer satıcı belirli sorgular içine postprocessed alacak nötr sorgular satıcı bunu geçebilir jdbc Connection nesnesi yöntemle.


Bu native () yöntemi ilginç görünüyor. Nasıl kullanılabileceğine dair örnekler var mı? Orada ne tür dönüşümler yapılabilir?
Thilo

@Thilo örn. SQL Server 2014, nativeSQL Yöntemi (SQLServerConnection) : "Bu yöntem şu anda SQL Server için Microsoft JDBC Sürücüsü tarafından desteklenmiyor."
Gerold Broser

@Thilo OJDBC'nin OracleConnectionWrapper'ı destekliyor gibi görünüyor.
Gerold Broser


5

Zql'yi deneyin


4
zql temel sorgular için iyidir, ancak join deyimi içeren bir sorguyu ayrıştırmaya çalıştığınızda patlar. bu yüzden bunu önermiyorum
zato

3

Hazırda Bekletme, sql ve hql ayrıştırma için ANTLR kullanır.

JSqlParser da iyi bir seçenektir. Oracle pl / sql ayrıştırılırken bazı hatalar (veya uygulanmayan bazı özellikler) olmasına rağmen. ayrıntılar için forumuna bakın.

oracle pl / sql'i ayrıştırıyorsanız ANTLR önerilir.


btw, anltr BSD altındadır.
Han Zheng

2

Ayrıştırılmış SQL ile ne yapmak istiyorsunuz? Varolan bir SQL gramerini kullanabileceğiniz birkaç Java / Lex / Yacc ( BYACC / J , Java Cup ) uygulamasını önerebilirim .

Sonuçta elde edilen ayrıştırılmış dilbilgisi ile gerçekten bir şeyler yapmak istiyorsanız , Java ile yazılmış açık kaynaklı bir SQL veritabanı olan Derby'ye bakmanızı öneririm .


Derby'de kullanılan SQL ayrıştırıcı bağımsız bir JAR olarak kullanılabilir mi?
Lluis Martinez

1
Bilmiyorum. Derby'nin kaynağına hiç bakmadım.
Thomas Jones-Low

1
Şimdi bu sorunun cevabını biliyorum: Hayır, Derby için SQL ayrıştırıcısı ayrı bir proje değil. Derby'den başka bir şey için kullanmak için onu ayırmanız gerekecek.
Thomas Jones-Low

1
10 yıl sonra tekrar geri geldi :-)
Lluis Martinez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.