开发者社区> 问答> 正文

解析Oracle SQL报错

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

展开
收起
山海行 2023-07-05 19:57:32 83 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的错误信息,报错信息是"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的文档和社区支持以获取更多帮助和解决方案

    2023-07-30 15:12:25
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    可能会更有助于我为您解决这个问题。以下是一些可能导致Oracle SQL解析失败的常见原因:

    缺少必要的关键字:Oracle SQL语句必须包含必要的关键字和语法元素,例如SELECT、FROM、WHERE、GROUP BY、ORDER BY等。如果您的SQL语句缺少这些元素,则可能会解析失败。

    语法错误:Oracle SQL语句的语法非常严格,必须按照正确的语法格式编写。如果您的SQL语句存在语法错误,例如拼写错误、缺少逗号或引号等问题,则可能会解析失败。

    数据类型不匹配:Oracle SQL语句中指定的数据类型必须与目标列的数据类型匹配。如果您尝试将不兼容的数据类型插入到目标列中,则可能会解析失败。

    权限问题:如果您没有足够的权限访问目标表格或执行目标SQL语句,则可能会解析失败。请确保您具有足够的权限,并且您正在使用正确的数据库用户登录。

    表格或列名不存在:如果您尝试访问不存在的表格或列,则可能会解析失败。请确保您正在访问正确的表格或列,并且它们存在于数据库中。

    2023-07-30 14:38:35
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 11:15:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像