2011-05-04 109 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语法分析程序库(的