【问题标题】:Need java API to parse SQL statements [closed]需要java API来解析SQL语句[关闭]
【发布时间】:2011-05-04 10:21:31
【问题描述】:

我需要一个 java API 来解析 SQL 语句。

例如,我有一个 SQL 查询

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

我需要检索表名“Products”和列名“Prog_ID”等。

如果可能,请提供任何教程或代码 sn-ps 的链接。

【问题讨论】:

标签: java sql parsing


【解决方案1】:

ANTLR 是一个解析器生成器,它有一个 SQL grammar,但这可能比你想象的要多。

只要你的要求没有变得太疯狂,你自己写一个会更简单。你需要多一般?

【讨论】:

  • 去过那里!解析 SQL 有点像噩梦——您需要解析特定的方言(ORACLE、SQLServer 等)。海量的关键字、不一致的语法、重载的关键字意味着你需要一个庞大而复杂的语法。
  • 我有一个非常简单的要求,上面发布的查询是我将使用的唯一格式。
  • @user727272,在这种情况下,您可以构造 ANTLR 语法以仅适合该格式,并对其进行解析。如果您发现 ANTLR 网站上的教程很难,我建议您购买 Terrence Parr 的书 -The Definitive ANTLR Reference
  • 解析 SQL 是一场噩梦……见我刚刚发的帖子:stackoverflow.com/questions/12863532/…
  • 难怪 - 您尝试使用正则表达式管理特定于供应商的 SQL?您的情况听起来像是“不要这样做”的案例研究。
【解决方案2】:

如果你有一个到数据库的连接,你可以使用准备好的语句来做到这一点:

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

然后您可以使用ResultSetMetaData.getColumnCount()getColumnName(int) 来检索列名。如果您的 JDBC 驱动程序支持它,您甚至可以使用 getTableName(int) 获取底层表名

请注意,并非所有驱动程序都支持在实际执行语句之前获取元数据,您需要使用正在使用的驱动程序对其进行测试。

【讨论】:

    【解决方案3】:

    最终使用来自http://zql.sourceforge.net/ 的 ZQL 解析库。

    如果你有简单的查询,那应该很容易完成这项工作

    【讨论】:

    • 除非现在有更好的答案,否则请将此标记为已接受的答案。
    • 如果我们有 Join,ZQL 解析器是否允许我们获取表名?
    【解决方案4】:

    正则表达式匹配仅适用于简单查询,SQL 具有复杂的递归语法,并且总会有一些子选择、分组依据或文字会破坏基于正则表达式的解析器。

    这里是a demo 说明了如何使用通用 sql 解析器来实现您所需要的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多