Thư viện trình phân tích cú pháp SQL cho Java [đã đóng]


140

Có một thư viện Java mã nguồn mở để phân tích cú pháp các câu lệnh SQL không?

Nếu có thể, nó phải có thể tùy chỉnh hoặc đủ linh hoạt để có thể phân tích cú pháp (hoặc ít nhất là bỏ qua) cú pháp dành riêng cho nhà cung cấp (như định nghĩa không gian bảng của Oracle hoặc mệnh đề LIMIT của MySQL).

Nếu không, việc tuân thủ nghiêm ngặt tiêu chuẩn SQL cũng tốt.

Cập nhật: Tôi cần điều này cho hai điều:

  • cung cấp giao diện SQL cho cơ sở dữ liệu không phải SQL (ánh xạ tới các lệnh gọi API nội bộ)
  • viết lại SQL trước khi nó đi đến cơ sở dữ liệu thực tế (ví dụ: Oracle)

109
Làm thế nào là câu hỏi này không mang tính xây dựng? Có chuyện gì với bạn vậy, Stackoverflow?
anton1980

11
Câu hỏi này nên được mở lại. Ngoài ra, đã tìm thấy Foundationdb.github.io/sql-parser
kervin

2
Đây là ngoài chủ đề - các yêu cầu cho thư viện, công cụ, hướng dẫn và các tài nguyên ngoài trang web khác không được coi là chủ đề cho StackOverflow.
Toby Speight

Tôi nghĩ rằng điều này nên được hỏi trên một trang web SE khác
peterchaula

4
Tôi nghĩ rằng câu hỏi này là xây dựng !!
Casualet

Câu trả lời:


51

ANTLR3 có sẵn một ngữ pháp SQL ANSI. Bạn có thể sử dụng điều đó để tạo trình phân tích cú pháp của riêng bạn.

ANTLR4 có ngữ pháp SQL .


5
Tại sao nên sử dụng ANTLR khi bạn có thể triển khai trình tạo trình phân tích cú pháp của riêng mình?
IAd CHƯƠNG

127
Tại sao tạo trình tạo trình phân tích cú pháp của riêng bạn khi bạn có thể sử dụng ANTLR?
duffymo

Bất kỳ liên kết đến cách một người có thể sử dụng Antlr SQL Grammar để phân tích các truy vấn này? Tôi đã xem xét ngữ pháp của một số Trình phân tích cú pháp PL / SQL cũng như Trình phân tích cú pháp và Trình phân tích cú pháp nhưng không thể hiểu cách sử dụng một. Sẽ đánh giá cao bất kỳ liên kết.
Abhishek

Bạn cung cấp ngữ pháp cho ANTLR, từ đó tạo ra các lớp lexer / trình phân tích cú pháp mà sau đó bạn sẽ biên dịch và chạy. Nguồn tốt nhất tôi có thể nghĩ đến là tài liệu tham khảo ANTLR: amazon.com/ Từ
duffymo

Bây giờ chúng tôi đã lên tới ANTLR 4. Có lẽ các ngữ pháp cũ không chạy trên phiên bản mới.
duffymo

34

Tôi có một câu hỏi cho Presto, Nếu tôi có câu lệnh Statement = SQL_PARSER.createStatement (truy vấn); Làm cách nào tôi có thể nhận phần thân Truy vấn, tức là các giá trị Chọn, Từ, Ở đâu, v.v.
quark

Tuyên bố là một lớp cơ sở. Một câu lệnh CHỌN sẽ có kiểu Truy vấn. Nó chứa QueryBody có phân lớp QuerySpecification. Cấu trúc phức tạp hơn bạn mong đợi để hỗ trợ UNION, BẢNG, GIÁ TRỊ, thiết lập các hoạt động, v.v. Bạn có thể tạo khách truy cập bằng cách mở rộng AstVisitor hoặc DefaultTraversalVisitor. Nhìn vào SqlFormatter để biết ví dụ về cách đi trên cây.
David Phillips

Có thể lấy cấu trúc cây truy vấn từ một truy vấn đã cho bằng Presto không?
MockedMan.Object

Tôi không chắc chắn những gì bạn đang hỏi. Bạn có thể tạo một câu hỏi mới với nhiều chi tiết hơn?
David Phillips

9

Trình phân tích cú pháp

Nếu bạn cần một trình phân tích cú pháp thì nên có một trình phân tích cú pháp trong cơ sở mã của Apache Derby .

Xử lý SQL dành riêng cho nhà cung cấp

Bạn có thể muốn xem phương thức .native () trên đối tượng jdbc Connection mà bạn có thể chuyển nó cho các truy vấn trung lập của nhà cung cấp sẽ được xử lý sau thành các truy vấn cụ thể của nhà cung cấp.


Đó là phương thức gốc () trông thú vị. Có bất kỳ ví dụ như làm thế nào nó có thể được sử dụng? Những loại chuyển đổi có thể có ở đó?
Thilo

@Thilo ví dụ như SQL Server 2014, nativeSQL Method (SQLServerConnection) : "Phương pháp này hiện không được hỗ trợ bởi trình điều khiển Microsoft JDBC cho SQL Server."
Gerold Broser

OracleConnectionWrapper của @Thilo dường như muốn hỗ trợ nó.
Gerold Broser


5

Hãy thử Zql


4
zql tốt cho các truy vấn cơ bản nhưng khi bạn cố phân tích một truy vấn có chứa câu lệnh nối, nó sẽ nổ tung. vì vậy tôi không đề xuất nó
zato

3

Hibernate sử dụng ANTLR để phân tích cú pháp sql và hql.

JSqlParser cũng là một lựa chọn tốt. Mặc dù nó có một số lỗi (hoặc một số tính năng không được triển khai) trong khi phân tích cú pháp oracle pl / sql. xem diễn đàn của nó để biết chi tiết.

vì vậy nếu bạn đang phân tích cú pháp oracle pl / sql, ANTLR được khuyến nghị.


btw, anltr thuộc BSD.
Han Zheng

2

Bạn muốn làm gì với SQL được phân tích cú pháp? Tôi có thể đề xuất một vài triển khai Java của Lex / Yacc ( BYACC / J , Java Cup ) mà bạn có thể sử dụng một ngữ pháp SQL hiện có với.

Nếu bạn thực sự muốn làm một cái gì đó với ngữ pháp được phân tích cú pháp, tôi có thể đề nghị xem xét về Derby , một cơ sở dữ liệu SQL nguồn mở được viết bằng Java.


Trình phân tích cú pháp SQL có được sử dụng trong Derby có sẵn dưới dạng JAR độc lập không?
Lluis Martinez

1
Tôi không biết. Tôi chưa bao giờ nhìn vào nguồn cho Derby.
Thomas Jones-Low

1
Bây giờ tôi biết câu trả lời cho câu hỏi này: Không, trình phân tích cú pháp SQL cho Derby không phải là một dự án riêng biệt. Bạn sẽ cần kéo nó ra để sử dụng nó cho một cái gì đó khác ngoài Derby.
Thomas Jones-Low

1
Tôi đã trở lại một lần nữa sau 10 năm :-)
Lluis Martinez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.