运行语句是: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
根据您提供的错误信息,报错是"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语句中的offset
和fetch
是您要查询的偏移量和每页记录数,您需要将其替换为实际的值。
以上SQL语句使用ROWNUM来实现分页查询,并且在子查询中按照特定的排序方式进行查询。然后,在外部查询中使用ROWNUM对结果进行筛选,以获取正确的分页结果。
请尝试将您的SQL语句修改为基于ROWNUM的分页查询,并确保语法正确。如果问题仍然存在,请提供更多关于报错信息、Druid版本和Oracle数据库版本的详细信息,以便我们提供更准确的帮助和解决方案。
这个错误可能是由于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语句引用的数据表或列名是正确的,并且它们存在于数据库中。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。