用于 Java 的 SQL 解析器库

是否有用于解析 SQL 语句的开源 Java 库?

如果可能的话,它应该是可定制的或足够灵活的,能够解析(或至少忽略)特定于供应商的语法(如 Oracle 表空间定义或 MySQL 的 LIMIT 子句)。

如果没有,严格遵守 SQL 标准也是可以的。

更新: 我需要它做两件事:

  • 提供到非 SQL 数据库的 SQL 接口(映射到内部 API 调用)
  • 在进入实际数据库之前重写 SQL (例如 Oracle)
104461 次浏览

ANTLR3 有一个 ANSI SQL 语法可用,您可以使用它来创建自己的解析器。

ANTLR4有一个 SQL 语法

您想对解析后的 SQL 做什么?我可以推荐一些可以使用现有 SQL 语法的 Lex/Yacc (BYACC/J爪哇杯)的 Java 实现。

如果您希望对解析后的语法进行实际操作,我建议您查看用 Java 编写的开源 SQL 数据库 德比

解析器

如果您需要一个解析器,那么在 阿帕奇・德比的代码库中应该有一个解析器。

处理特定于供应商的 SQL

您可能希望查看 jdbc Connection 对象上的 。本地()方法,您可以将与供应商无关的查询传递给它,这些查询将被后处理到特定于供应商的查询中。

  • JSqlParser
  • Trino 的解析器 是使用 ANTLR4编写的,它有自己的不可变 AST 类,这些类是从解析器构建的。AST 有访问者和漂亮的打印机。

试试 Zql

Hibernate 使用 ANTLR 进行 sql 和 hql 解析。

JSqlParser 也是一个很好的选择,尽管它在解析 oracle pl/sql 时有一些 bug (或者一些未实现的特性)。 详情请参阅论坛。

因此,如果要解析 oraclepl/sql,建议使用 ANTLR。

用于 Java 的通用 SQL 解析器不是开源的,但正是您所关注的。