2011-05-04 105 views
3

我需要一個java API來解析SQL語句。需要java API來解析SQL語句

例如,我有一個SQL查詢

SELECT 
    PRODUCTS.PROD_ID, 
    PRODUCTS.PROD_NAME, 
    PRODUCTS.PROD_CATEGORY, 
    PRODUCTS.PROD_TOTAL_ID 
FROM 
    PRODUCTS

我需要檢索表名「產品」和列名「Prog_ID」等

請提供教程或任何鏈接代碼片段如果可能的話。

+0

可能重複http://stackoverflow.com/questions/660609/sql-parser- library-for-java) – codingbadger 2011-06-15 12:51:05

回答

2

使用來自http://zql.sourceforge.net/的ZQL解析庫結束。

如果您在簡單查詢,也應該做的工作很容易

+0

請將此標記爲「接受的答案」,除非現在有更好的答案。 – 2012-01-08 12:32:09

4

ANTLR是一個解析器生成器,它有一個SQL grammar,但這可能比你討價還價的更多。

只要您的要求不會太瘋狂,自己寫一個會更簡單。你需要多大程度?

+5

在那裏完成了!解析SQL有點噩夢 - 你需要解析一個特定的方言(ORACLE,SQLServer等)。大量的關鍵字,不一致的語法,關鍵字的重載意味着你需要一個龐大而複雜的語法。 – 2011-05-04 10:42:07

+0

我有一個非常簡單的要求,上面發佈的查詢是我將要使用的唯一格式。 – user727272 2011-05-04 12:36:38

+0

@ user727272,在這種情況下,您可以構造ANTLR語法以僅適用於該格式,並解析它。如果您在ANTLR網站上找到教程以獲得Terrence Parr的書 - [The Definitive ANTLR Reference](http://pragprog.com/titles/tpantlr/the-definitive-antlr-reference)很難。 – 2011-06-15 06:45:33

3

如果您有與數據庫的連接,你可以做,用事先準備好的聲明:

String sql = "...."; 
PreparedStatement pstmt = connection.prepareStatement(sql); 
ResultSetMetaData meta = pstmt.getMetaData(); 

然後你可以使用ResultSetMetaData.getColumnCount()getColumnName(int)來檢索列名。如果您的JDBC驅動程序支持它,您甚至可以使用getTableName(int)

請注意,並非所有驅動程序都支持在實際執行語句之前獲取元數據,您需要使用您正在使用的那個進行測試。

1

正則表達式匹配只適用於簡單查詢,SQL有一個複雜的遞歸語法,並且總會有一些子選擇,分組依據或文字,這些會破壞基於正則表達式的解析器。

下面是a demo說明如何實現您需要使用一般的SQL語法分析程序是什麼:

[對Java SQL語法分析程序庫(的