Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Java的SQL解析器库_Java_Sql_Parsing - Fatal编程技术网

用于Java的SQL解析器库

用于Java的SQL解析器库,java,sql,parsing,Java,Sql,Parsing,是否有用于解析SQL语句的开源Java库 如果可能,它应该是可定制的或足够灵活的,以便能够解析或至少忽略特定于供应商的语法,如Oracle表空间定义或MySQL的LIMIT子句 如果不是,严格遵守SQL标准也可以 更新:我需要这两件事: 向映射到内部API调用的非SQL数据库提供SQL接口 在SQL进入实际数据库(如Oracle)之前重写SQL 具有可用的ANSI SQL语法。您可以使用它来创建自己的解析器 ANTLR4有一个。您想对解析后的SQL做什么?我可以推荐一些Lex/Yacc的Java

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

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

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

更新:我需要这两件事:

向映射到内部API调用的非SQL数据库提供SQL接口 在SQL进入实际数据库(如Oracle)之前重写SQL 具有可用的ANSI SQL语法。您可以使用它来创建自己的解析器


ANTLR4有一个。

您想对解析后的SQL做什么?我可以推荐一些Lex/Yacc的Java实现,您可以使用现有的SQL语法

如果您真的想用解析后的语法做点什么,我建议您看看用Java编写的开源SQL数据库

语法分析器

如果您需要一个解析器,那么在的代码库中应该有一个解析器

处理特定于供应商的SQL

您可能希望查看jdbc连接对象上的方法,您可以向它传递与供应商无关的查询,这些查询将被后处理为供应商特定的查询

使用ANTLR4编写,并且有自己的不可变AST类,这些类是从解析器构建的。AST有一个访问者和漂亮的打印机。
试试看,Hibernate使用ANTLR进行sql和hql解析

JSqlParser也是一个不错的选择。尽管它在解析oracle pl/sql时有一些错误或一些功能没有实现。 详情见论坛



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

不是开源的,但正是您所关注的。

这个本机方法看起来很有趣。有没有关于如何使用它的例子?那里可能有什么类型的转换?@Thilo例如:Microsoft JDBC驱动程序SQL Server目前不支持这种方法。@Thilo OJDBC似乎支持这种方法。Derby中使用的SQL解析器是否作为独立的JAR提供?我不知道。我从来没有看过Derby的源代码,现在我知道了这个问题的答案:不,Derby的SQL解析器不是一个单独的项目。你需要把它拆开以用于除Derby之外的其他用途。10年后我又回来了:-当你可以实现你自己的解析器生成器时为什么要使用ANTLR?当你可以使用ANTLR时为什么要生成你自己的解析器生成器?有没有关于如何使用ANTLR SQL语法来解析这些查询的链接?我查看了一些PL/SQL解析器以及词法分析器和解析器的语法,但无法理解如何使用它们。如果有任何链接,我将不胜感激。您将语法提供给ANTLR,ANTLR将输出您将编译和运行的lexer/parser类。我能想到的最好的资料来源是ANTLR参考:我们现在就看ANTLR 4了。也许旧语法不在新版本上运行。顺便说一句,anltr在BSD下。Java+1的最佳sql解析器无人提及,这是我见过的最全面的sql解析器NZQL适用于基本查询,但当您尝试解析包含join语句的查询时,它会崩溃。所以我不认为这个问题没有建设性?你怎么了,Stackoverflow?这个问题应该重新开始。此外,发现这是离题的-StackOverflow主题不考虑对库、工具、教程和其他离题资源的请求。我认为这应该在另一个SE站点上提出。我认为这个问题是有建设性的!!如果我有Statement=SQL\u PARSER.createStatementquery;如何获取查询体,即Select、From、Where等值?语句是一个基类。SELECT语句的类型为Query。它包含具有子类QuerySpecification的QueryBody。为了支持UNION、TABLE、VALUES、set操作等,结构比您预期的要复杂。您可以通过扩展AstVisitor或DEFAULTTRAVERSALVISTOR来创建访问者。查看SqlFormatter,了解如何遍历树的示例。是否可以使用Presto从给定查询中获取查询树结构?我不确定您在问什么。你能创建一个更详细的新问题吗?