Java的SQL解析器库


140

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

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

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

更新:我需要两件事:

  • 提供到非SQL数据库的SQL接口(映射到内部API调用)
  • 在将SQL转到实际数据库(例如Oracle)之前重写SQL

109
这个问题怎么没有建设性?你怎么了,Stackoverflow?
anton1980

11
这个问题应该重新讨论。另外,找到Foundationdb.github.io/sql-parser
kervin 2014年

2
这是题外话-对于库,工具,教程和其他场外资源的请求,对于StackOverflow而言不是题外的。
Toby Speight

我认为应该在另一个SE网站上问这件事
peterchaula

4
我认为这个问题是建设性的!
Casualet

Answers:


51

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

ANTLR4具有SQL语法


5
可以实现自己的解析器生成器时,为什么要使用ANTLR?
IAdapter 2010年

127
为什么可以使用ANTLR生成自己的解析器生成器?
duffymo'5

如何使用Antlr SQL语法解析这些查询的任何链接?我查看了一些PL / SQL解析器以及Lexers和Parsers的语法,但无法理解如何使用它。将不胜感激任何链接。
Abhishek 2012年

您将语法提供给ANTLR,后者会吐出词法分析器/解析器类,然后您将对其进行编译和运行。我能想到的最好的消息来源是ANTLR参考:amazon.com/…–
duffymo

我们现在要使用ANTLR 4。也许旧的语法不能在新版本上运行。
duffymo

34
  • JSqlParser
  • Presto的解析器是使用ANTLR4编写的,并具有从解析器构建的自己不变的AST类。AST有一个访客和漂亮的打印机。

我有一个关于Presto的问题,如果我有Statement statement = SQL_PARSER.createStatement(query); 如何获取查询主体,即Select,From,Where等值?
夸克

语句是基类。SELECT语句的类型为Query。它包含一个具有子类QuerySpecification的QueryBody。为了支持UNION,TABLE,VALUES,设置操作等,结构比您预期的要复杂。您可以通过扩展AstVisitor或DefaultTraversalVisitor来创建访问者。查看SqlFormatter,了解如何遍历树的示例。
大卫·菲利普斯

是否可以使用Presto从给定查询中获取查询树结构?
MockedMan.Object 2015年

我不确定你在问什么。您可以创建一个更详细的新问题吗?
David Phillips

9

解析器

如果需要解析器,则Apache Derby的代码库中应该有一个解析器。

处理特定于供应商的SQL

您可能需要查看jdbc Connection对象上的.native()方法,可以将其传递给供应商中性查询,该查询将被后处理为供应商特定的查询。


该native()方法看起来很有趣。关于如何使用它有什么例子吗?那里可能进行哪种转换?
Thilo

@Thilo,例如SQL Server 2014,nativeSQL方法(SQLServerConnection)“ SQL Server的Microsoft JDBC驱动程序当前不支持此方法。”
Gerold Broser 2014年

@Thilo OJDBC的OracleConnectionWrapper似乎支持它。
Gerold Broser 2014年


5

试试Zql


4
zql适用于基本查询,但是当您尝试分析包含join语句的查询时,它会崩溃。所以我不建议这样做
zato

3

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

JSqlParser也是一个不错的选择,尽管它在解析oracle pl / sql时存在一些错误(或某些未实现的功能)。请参阅其论坛以获取详细信息。

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


顺便说一句,anltr在BSD下。
韩正

2

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

如果您想对生成的语法分析做一些实际的事情,我建议您查看一下Derby,这是一个用Java编写的开源SQL数据库。


Derby中使用的SQL解析器是否可以作为独立的JAR使用?
Lluis Martinez

1
我不知道。我从未看过Derby的来源。
Thomas Jones-Low

1
我现在知道此问题的答案:不,Derby的SQL解析器不是一个单独的项目。您需要将其拆开以用于Derby以外的其他用途。
Thomas Jones-Low

1
十年后,我又回来了:-)
路易斯·马丁内斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.