Druid Version: 1.1.9
SQL: SELECT J01.COL_A, J01.COL_B, "SUM"(J01.COL_C) OVER ( PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS COL_C FROM TAB_A J01
java: package com.xiaolong.druid;
import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; import com.alibaba.druid.sql.parser.SQLStatementParser;
// 测试druid public class Test_Druid_Sql {
public static void main(String[] args) { String sql = " SELECT\r\n" + " J01.COL_A,\r\n" + " J01.COL_B,\r\n" + " "SUM"(J01.COL_C) OVER (\r\n" + " PARTITION BY J01.COL_A ORDER BY J01.COL_B NULLS FIRST ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW\r\n" + " ) AS COL_C\r\n" + " FROM\r\n" + " TAB_A J01\r\n" + "";
// 新建 ORACLE Parser
SQLStatementParser parser = new OracleStatementParser(sql);
// 使用Parser解析生成AST,这里SQLStatement就是AST
SQLStatement statement = parser.parseStatement();
// 使用visitor来访问AST
OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
statement.accept(visitor);
System.out.println(visitor.getTables());
}
}
报错: Exception in thread "main" com.alibaba.druid.sql.parser.ParserException: ERROR. pos 138, line 5, column 64, token BETWEEN at com.alibaba.druid.sql.parser.SQLExprParser.primary(SQLExprParser.java:793) at com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser.primary(OracleExprParser.java:462) at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:86) at com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser.parseAggregateExpr(OracleExprParser.java:834) at com.alibaba.druid.sql.parser.SQLExprParser.methodRest(SQLExprParser.java:1051) at com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser.methodRest(OracleExprParser.java:500) at com.alibaba.druid.sql.parser.SQLExprParser.primaryRest(SQLExprParser.java:960) at com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser.primaryRest(OracleExprParser.java:668) at com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser.primary(OracleExprParser.java:314) at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:86) at com.alibaba.druid.sql.parser.SQLExprParser.parseSelectItem(SQLExprParser.java:3061) at com.alibaba.druid.sql.parser.SQLSelectParser.parseSelectList(SQLSelectParser.java:508) at com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser.query(OracleSelectParser.java:299) at com.alibaba.druid.sql.dialect.oracle.parser.OracleSelectParser.select(OracleSelectParser.java:75) at com.alibaba.druid.sql.parser.SQLStatementParser.parseSelect(SQLStatementParser.java:2412) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatement(SQLStatementParser.java:2686) at com.xiaolong.druid.Test_Druid_Sql.main(Test_Druid_Sql.java:26)
原提问者GitHub用户longxm
根据您提供的错误信息,报错信息是"ParserException: ERROR. pos 138, line 5, column 64, token BETWEEN",这表明Druid解析Oracle SQL语句时出现了错误。
根据报错信息,问题可能出在SQL语句中的BETWEEN关键字。在您提供的代码中,SQL语句中使用了以下部分:
BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
BETWEEN关键字的使用需要指定两个边界值,但在您的SQL语句中似乎缺少了这些边界值。请确认您的SQL语句是否正确并包含必要的边界值。
此外,请确保您正在使用的Druid版本与您使用的Oracle数据库版本兼容。有时候,Druid的旧版本可能无法正确解析某些特定的SQL语句,在这种情况下,升级到最新版本可能会解决问题。
如果问题仍然存在,建议您尝试使用最新版本的Druid,或者查看Druid的文档和社区支持以获取更多帮助和解决方案
可能会更有助于我为您解决这个问题。以下是一些可能导致Oracle SQL解析失败的常见原因:
缺少必要的关键字:Oracle SQL语句必须包含必要的关键字和语法元素,例如SELECT、FROM、WHERE、GROUP BY、ORDER BY等。如果您的SQL语句缺少这些元素,则可能会解析失败。
语法错误:Oracle SQL语句的语法非常严格,必须按照正确的语法格式编写。如果您的SQL语句存在语法错误,例如拼写错误、缺少逗号或引号等问题,则可能会解析失败。
数据类型不匹配:Oracle SQL语句中指定的数据类型必须与目标列的数据类型匹配。如果您尝试将不兼容的数据类型插入到目标列中,则可能会解析失败。
权限问题:如果您没有足够的权限访问目标表格或执行目标SQL语句,则可能会解析失败。请确保您具有足够的权限,并且您正在使用正确的数据库用户登录。
表格或列名不存在:如果您尝试访问不存在的表格或列,则可能会解析失败。请确保您正在访问正确的表格或列,并且它们存在于数据库中。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。