ไลบรารีตัวแยกวิเคราะห์ SQL สำหรับ Java [ปิด]


141

มีห้องสมุด Java โอเพ่นซอร์สสำหรับการแยกคำสั่ง SQL หรือไม่

หากเป็นไปได้ควรปรับแต่งหรือยืดหยุ่นพอที่จะสามารถแยกวิเคราะห์ (หรืออย่างน้อยละเว้น) ไวยากรณ์เฉพาะของผู้ขาย (เช่นคำจำกัดความของพื้นที่ตาราง Oracle หรือคำสั่ง LIMIT ของ MySQL)

หากไม่ปฏิบัติตามมาตรฐาน SQL อย่างเข้มงวดก็สามารถทำได้เช่นกัน

ปรับปรุง:ฉันต้องการสิ่งนี้สำหรับสองสิ่ง:

  • การจัดเตรียมอินเตอร์เฟส SQL ไปยังฐานข้อมูลที่ไม่ใช่ SQL (การแม็พกับการเรียก API ภายใน)
  • เขียนใหม่ SQL ก่อนที่จะไปยังฐานข้อมูลจริง (เช่น Oracle)

109
คำถามนี้ไม่สร้างสรรค์อย่างไร เกิดอะไรขึ้นกับคุณ Stackoverflow
anton1980

11
คำถามนี้ควรเปิดใหม่ นอกจากนี้ยังพบfoundationdb.github.io/sql-parser
kervin

2
นี่เป็นหัวข้อนอก - คำขอห้องสมุดเครื่องมือบทช่วยสอนและทรัพยากรนอกไซต์อื่น ๆ จะไม่ถูกนำมาพิจารณาในหัวข้อสำหรับ StackOverflow
Toby Speight

ฉันคิดว่าควรถามคำถามนี้ในไซต์ SE อื่น
peterchaula

4
ฉันคิดว่าคำถามนี้สร้างสรรค์มาก !!
Casualet

คำตอบ:


51

ANTLR3มีไวยากรณ์ของ ANSI SQL อยู่ คุณสามารถใช้มันเพื่อสร้างเครื่องมือแยกวิเคราะห์ของคุณเอง

ANTLR4 มีไวยากรณ์ SQL


5
ทำไมต้องใช้ ANTLR เมื่อคุณสามารถใช้เครื่องมือสร้าง parser ของคุณเอง
IAdapter

127
ทำไมต้องสร้างเครื่องมือแยกวิเคราะห์ของคุณเองเมื่อคุณสามารถใช้ ANTLR
duffymo

ลิงก์ใดที่เชื่อมโยงไปยังวิธีที่สามารถใช้ Antlr SQL Grammar เพื่อแยกเคียวรีเหล่านี้? ฉันดูไวยากรณ์ของตัวแยกวิเคราะห์ PL / SQL บางตัวเช่นเดียวกับ Lexers และตัวแยกวิเคราะห์ แต่ไม่สามารถเข้าใจวิธีใช้งานได้ จะขอบคุณลิงก์ใด ๆ
Abhishek

คุณป้อนไวยากรณ์เป็น ANTLR ซึ่งแยกคลาส lexer / parser ที่คุณจะรวบรวมและเรียกใช้ แหล่งที่ดีที่สุดที่ฉันคิดได้คือการอ้างอิง ANTLR: amazon.com/
..

เราถึง ANTLR 4 แล้ว บางทีไวยากรณ์เก่าไม่ทำงานในเวอร์ชันใหม่
duffymo

34

ฉันมีคำถามสำหรับ Presto หากฉันมีคำสั่ง Statement = SQL_PARSER.createStatement (แบบสอบถาม); ฉันจะได้รับ Query body ได้อย่างไรเช่น Select, From, Where, etc
ควาร์ก

คำชี้แจงเป็นชั้นฐาน คำสั่ง SELECT จะเป็นชนิดของแบบสอบถาม มันมี QueryBody ที่มีคลาสย่อย QuerySpecification โครงสร้างมีความซับซ้อนมากกว่าที่คุณคาดหวังเพื่อสนับสนุน UNION, Table, VALUES, set actions และอื่น ๆ คุณสามารถสร้างผู้เยี่ยมชมโดยขยาย AstVisitor หรือ DefaultTraversalVisitor ดู SqlFormatter สำหรับตัวอย่างของวิธีการเดินต้นไม้
David Phillips

เป็นไปได้ไหมที่จะรับโครงสร้างแผนภูมิคิวรีจากคิวรีที่กำหนดโดยใช้ Presto
MockedMan.Object

ฉันไม่แน่ใจว่าคุณกำลังถามอะไร คุณสามารถสร้างคำถามใหม่พร้อมรายละเอียดเพิ่มเติมได้หรือไม่
David Phillips

9

parser

หากคุณต้องการ parser ควรมีตัวแยกวิเคราะห์ในฐานรหัสของApache Derby

การจัดการกับ SQL เฉพาะผู้ขาย

คุณอาจต้องการดูวิธีการ. native ()บนวัตถุการเชื่อมต่อ jdbc ซึ่งคุณสามารถผ่านการสอบถามแบบเป็นกลางของผู้ขายซึ่งจะได้รับการประมวลผลภายหลังลงในแบบสอบถามแบบเฉพาะผู้ขาย


วิธี Native () นั้นดูน่าสนใจ มีตัวอย่างใด ๆ เกี่ยวกับวิธีการใช้หรือไม่? มีการแปลงประเภทใดบ้างที่เป็นไปได้
Thilo

@Thilo เช่นSQL Server 2014, nativeSQL Method (SQLServerConnection) : "วิธีนี้ไม่ได้รับการสนับสนุนโดย Microsoft JDBC Driver สำหรับ SQL Server"
Gerold Broser

OracleConnectionWrapper @Thilo OJDBC ดูเหมือนสนับสนุน
Gerold Broser

7

Parser SQL ทั่วไปสำหรับ Javaไม่ใช่โอเพ่นซอร์ส แต่เป็นสิ่งที่คุณต้องการอย่างแน่นอน


1
ตัวแยกวิเคราะห์ sql ที่ดีที่สุดสำหรับ Java +1

แปลกใจไม่มีใครเอ่ยถึงgithub.com/porcelli/plsql-parser.gitนี้เป็นที่สุด parser SQL ครอบคลุมผมเคยเห็น
zinking

5

ลองZql


4
zql นั้นดีสำหรับการสืบค้นพื้นฐาน แต่เมื่อคุณพยายามที่จะแยกแบบสอบถามที่มีคำสั่งเข้าร่วมมันจะระเบิดขึ้น ดังนั้นฉันไม่แนะนำเลย
zato

3

Hibernate ใช้ ANTLR สำหรับการแยกวิเคราะห์ sql และ hql

JSqlParser ยังเป็นตัวเลือกที่ดีแม้มีข้อบกพร่องบางอย่าง (หรือคุณสมบัติบางอย่างที่ไม่ได้ใช้) ในขณะที่แยกวิเคราะห์ oracle pl / sql ดูฟอรั่มเพื่อดูรายละเอียด

ดังนั้นหากคุณแยกวิเคราะห์ oracle pl / sql แนะนำให้ใช้ ANTLR


btw, anltr อยู่ภายใต้ BSD
Han Zheng

2

คุณต้องการทำอะไรกับ SQL ที่วิเคราะห์คำ? ฉันสามารถแนะนำการใช้ Java ของ Lex / Yacc ( BYACC / J , Java Cup ) บางอย่างที่คุณสามารถใช้ไวยากรณ์ SQL ที่มีอยู่ด้วย

หากคุณต้องการทำบางสิ่งบางอย่างกับไวยากรณ์ที่ได้รับการแยกวิเคราะห์ฉันอาจแนะนำให้ดูDerbyซึ่งเป็นฐานข้อมูล SQL โอเพ่นซอร์สที่เขียนใน Java


ตัวแยกวิเคราะห์ SQL ใช้ใน Derby เป็น JAR อิสระหรือไม่?
Lluis Martinez

1
ฉันไม่รู้ ฉันไม่เคยดูแหล่งข้อมูลสำหรับดาร์บี้
Thomas Jones-Low

1
ตอนนี้ฉันรู้คำตอบสำหรับคำถามนี้: ไม่ตัวแยกวิเคราะห์ SQL สำหรับดาร์บี้ไม่ใช่โครงการแยกต่างหาก คุณจะต้องดึงมันออกจากกันเพื่อใช้กับสิ่งอื่นที่ไม่ใช่ดาร์บี้
Thomas Jones-Low

1
ฉันกลับมาอีกครั้งหลังจาก 10 ปี :-)
Lluis Martinez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.