开发者社区> 问答> 正文

sql parser:Stat,db2,with语句

执行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

展开
收起
山海行 2023-07-05 21:34:06 80 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在执行DB2中含有WITH的脚本时,如果报错,可以尝试以下几种方法:

    检查脚本语法,确保符合DB2的语法规范。可以使用DB2客户端测试脚本,检查脚本的语法和执行结果是否正确。

    检查DB2的版本和配置,确保支持WITH语法。WITH语法是DB2 9.7及以上版本才支持的,如果使用的是早期版本的DB2,可能不支持WITH语法。

    检查DB2连接池的配置,确保连接池设置合理。如果连接池的最大连接数过低,可能会导致执行脚本时出现连接池满的情况,从而导致脚本执行失败。可以适当增加连接池的最大连接数,以避免这个问题。

    检查防火墙或者过滤器的配置,确保不会阻止脚本的执行。有些防火墙或者过滤器可能会阻止某些SQL语句的执行,包括WITH语法。可以尝试关闭防火墙或者过滤器,或者修改其配置,以允许脚本的执行。

    2023-07-30 09:36:13
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据你提供的异常信息,可以看出是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子句的脚本,并检查其他可能导致问题的配置或代码。

    希望这可以帮助到你。如果你还有其他问题,请随时提问。

    2023-07-11 17:16:35
    赞同 展开评论 打赏
  • 需要改jar包下的META-INF/druid/wall目录下的过滤配置。不过不配置wall防火墙拦截也是可以正常使用的,项目中把filters="stat,log4j,wall"中的wall去掉即可。

    原回答者GitHub用户sxrstrive

    2023-07-06 12:17:24
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载