执行db2中含有with的脚本报错,db2客户端测试脚本通过, 如果不配置wallfilter可以,其中filter配置filters="stat,log4j,wall"
脚本: with temp as( select a.dmnr,a.bz,a.jgqjbs,a.jgqjms,a.px from dm.td_hzdmb a where a.dm=5 ) temp2 as( select a.dmnr,a.bz,a.jgqjbs,a.jgqjms,a.px from dm.td_hzdmb a where a.dm=4 ) select * from temp union all select * from temp2
异常信息如下: Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'WITH temp as( sele',expect WITH, actual WITH WITH at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:239) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:424) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:147) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:620) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:574) at com.alibaba.druid.wall.WallFilter.check(WallFilter.java:711) ... 109 more
原提问者GitHub用户sxrstrive
在执行DB2中含有WITH的脚本时,如果报错,可以尝试以下几种方法:
检查脚本语法,确保符合DB2的语法规范。可以使用DB2客户端测试脚本,检查脚本的语法和执行结果是否正确。
检查DB2的版本和配置,确保支持WITH语法。WITH语法是DB2 9.7及以上版本才支持的,如果使用的是早期版本的DB2,可能不支持WITH语法。
检查DB2连接池的配置,确保连接池设置合理。如果连接池的最大连接数过低,可能会导致执行脚本时出现连接池满的情况,从而导致脚本执行失败。可以适当增加连接池的最大连接数,以避免这个问题。
检查防火墙或者过滤器的配置,确保不会阻止脚本的执行。有些防火墙或者过滤器可能会阻止某些SQL语句的执行,包括WITH语法。可以尝试关闭防火墙或者过滤器,或者修改其配置,以允许脚本的执行。
根据你提供的异常信息,可以看出是Druid SQL解析器在解析带有WITH语句的脚本时报错了。异常信息中提到了"expect WITH, actual WITH WITH",这可能意味着解析器在处理WITH语句时出现了问题。
在你的脚本中,看起来你试图创建了两个临时表(temp和temp2),然后使用UNION ALL将它们的结果合并。然而,根据Druid SQL解析器的行为,它可能无法正确解析带有多个WITH子句的脚本。
为了解决这个问题,你可以尝试将两个WITH子句合并成一个。以下是修改后的脚本:
with temp as (
select a.dmnr, a.bz, a.jgqjbs, a.jgqjms, a.px
from dm.td_hzdmb a
where a.dm = 5
), temp2 as (
select a.dmnr, a.bz, a.jgqjbs, a.jgqjms, a.px
from dm.td_hzdmb a
where a.dm = 4
)
select * from temp
union all
select * from temp2;
请注意,上述脚本将两个WITH子句合并成一个,并使用逗号将它们分隔开。这样,Druid SQL解析器应该能够正确解析脚本。
如果你仍然遇到问题,请确保使用的Druid版本支持解析带有多个WITH子句的脚本,并检查其他可能导致问题的配置或代码。
希望这可以帮助到你。如果你还有其他问题,请随时提问。
需要改jar包下的META-INF/druid/wall目录下的过滤配置。不过不配置wall防火墙拦截也是可以正常使用的,项目中把filters="stat,log4j,wall"中的wall去掉即可。
原回答者GitHub用户sxrstrive
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。