开发者社区> 问答> 正文

Oracle分页查询下一页时出现语法解析错误 com.alibaba.druid.sql.parse

运行语句是:SELECT specialact0_. ID AS id1_14_, specialact0_.gmt_create AS gmt_create2_14_, specialact0_.gmt_modified AS gmt_modified3_14_, specialact0_.issuer AS issuer4_14_, specialact0_.prisonarea AS prisonarea5_14_, specialact0_.prisonarea_code AS prisonarea_code6_14_, specialact0_. NAME AS name7_14_, specialact0_.prison AS prison8_14_, specialact0_.synopsis AS synopsis9_14_, specialact0_.sys_orgcode AS sys_orgcode10_14_, specialact0_.sys_orgname AS sys_orgname11_14_, specialact0_.sys_permname AS sys_permname12_14_, specialact0_.sys_perrmcode AS sys_perrmcode13_14_, specialact0_. TIMES AS times14_14_ FROM hs_special_activities specialact0_ WHERE 1 = 1 offset ? ROWS FETCH NEXT ? ROWS ONLY

原提问者GitHub用户jojocodeX

展开
收起
山海行 2023-07-05 19:55:14 64 0
3 条回答
写回答
取消 提交回答
  • 根据您提供的错误信息,报错是"com.alibaba.druid.sql.parse",这表明Druid在解析Oracle分页查询时出现了语法解析错误。

    根据您提供的SQL语句:

    SELECT specialact0_.ID AS id1_14_, specialact0_.gmt_create AS gmt_create2_14_, specialact0_.gmt_modified AS gmt_modified3_14_, specialact0_.issuer AS issuer4_14_, specialact0_.prisonarea AS prisonarea5_14_, specialact0_.prisonarea_code AS prisonarea_code6_14_, specialact0_. NAME AS name7_14_, specialact0_.prison AS prison8_14_, specialact0_.synopsis AS synopsis9_14_, specialact0_.sys_orgcode AS sys_orgcode10_14_, specialact0_.sys_orgname AS sys_orgname11_14_, specialact0_.sys_permname AS sys_permname12_14_, specialact0_.sys_perrmcode AS sys_perrmcode13_14_, specialact0_. TIMES AS times14_14_ FROM hs_special_activities specialact0_ WHERE 1 = 1 offset ? ROWS FETCH NEXT ? ROWS ONLY
    

    该SQL语句使用了OFFSET和FETCH NEXT子句来进行分页查询。根据您提供的错误信息,Druid无法正确解析这个语句。

    在Oracle中,OFFSET关键字是不支持的,而是使用ROWNUM来实现分页查询。以下是一种常见的方式来实现基于ROWNUM的分页查询:

    SELECT *
    FROM (
      SELECT t.*, ROWNUM rnum
      FROM (
        SELECT specialact0_.ID, specialact0_.gmt_create, specialact0_.gmt_modified, specialact0_.issuer, specialact0_.prisonarea, specialact0_.prisonarea_code, specialact0_.NAME, specialact0_.prison, specialact0_.synopsis, specialact0_.sys_orgcode, specialact0_.sys_orgname, specialact0_.sys_permname, specialact0_.sys_perrmcode, specialact0_.TIMES
        FROM hs_special_activities specialact0_
        WHERE 1 = 1
        ORDER BY specialact0_.ID
      ) t
      WHERE ROWNUM <= (offset + fetch)
    )
    WHERE rnum > offset
    

    请注意,上述SQL语句中的offsetfetch是您要查询的偏移量和每页记录数,您需要将其替换为实际的值。

    以上SQL语句使用ROWNUM来实现分页查询,并且在子查询中按照特定的排序方式进行查询。然后,在外部查询中使用ROWNUM对结果进行筛选,以获取正确的分页结果。

    请尝试将您的SQL语句修改为基于ROWNUM的分页查询,并确保语法正确。如果问题仍然存在,请提供更多关于报错信息、Druid版本和Oracle数据库版本的详细信息,以便我们提供更准确的帮助和解决方案。

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

    这个错误可能是由于SQL语句的语法错误或者使用了不支持的语法导致的。一些常见的原因包括:

    语法错误:您的SQL语句可能存在语法错误,例如拼写错误、缺少逗号或引号等问题。请仔细检查您的SQL语句,确保它符合Oracle SQL语法规范。

    分页查询语法错误:如果您正在尝试进行分页查询,并且使用了不正确的语法,也可能导致这个错误。在Oracle中,常用的分页查询语法是使用ROWNUM进行查询,例如:

    sql_more
    Copy
    SELECT
    FROM (SELECT t.
    , ROWNUM rn
    FROM (SELECT *
    FROM your_table
    ORDER BY id) t
    WHERE ROWNUM <= ?)
    WHERE rn >= ?
    在这个SQL语句中,我们使用ROWNUM进行分页查询,并且使用子查询来实现排序。您可以根据您的具体情况修改这个SQL语句,以符合您的需求。

    使用了不支持的语法:如果您的SQL语句使用了Oracle不支持的语法或者非标准的语法,也可能导致这个错误。请确保您的SQL语句使用的是Oracle支持的标准语法。

    数据表或列名错误:如果您的SQL语句引用了不存在的数据表或列名,也可能导致这个错误。请确保您的SQL语句引用的数据表或列名是正确的,并且它们存在于数据库中。

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

    原回答者GitHub用户wenshao

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

相关电子书

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

相关镜像