Druid版本:
com.alibaba druid 1.2.4
下面是一条在本地环境运行正常的SQL:
SELECT * FROM "CUSTOM_LABEL" "cl" LEFT JOIN ( "CUSTOM_LABEL_BAK" "clb"
LEFT JOIN "DATA_SOURCE_INFO" "dsi" ON "clb"."CUSTOM_LABEL_VALUE" = "dsi"."REMARK" ) ON "cl"."ACCURACY_TYPE" = "clb"."CUSTOM_LABEL_NAME"
解析的代码:
SQLStatementParser statementParser = new OracleStatementParser(sql); SQLSelectStatement sqlStatement = (SQLSelectStatement)statementParser.parseStatement(); SQLSelect select = sqlStatement.getSelect();
出现的异常:
com.alibaba.druid.sql.parser.ParserException: TODO :pos 64, line 1, column 47, token LITERAL_ALIAS "CUSTOM_LABEL_BAK"
测试发现,如果将双引号全部去掉,能够正常解析;或者保留引号,调整联表顺序,去掉里面的括号,也可以解析。 但是,由于我们不能要求SQL的格式,只能保证SQL能够运行,所以希望能够支持这种类型的SQL
原提问者GitHub用户liu871009243
PL/SQL中执行该语句:select XMLSERIALIZE(DOCUMENT EXTRACT(a.xml_cont, '/document') AS CLOB) AS xmlCont,a. from inpcase.hospital_record a where 1=1 and ipid = #{ipid}
没有问题,
在druid中报错:Cause: java.sql.SQLException: sql injection violation, dbType oracle, , druid-version 1.2.8, syntax error: syntax error, expect ), actual EXTRACT pos 37, line 1, column 31, token EXTRACT : select XMLSERIALIZE(DOCUMENT EXTRACT(a.xml_cont, '/document') AS CLOB) AS xmlCont,a. from inpcase.hospital_record a where 1=1 and ipid = ?
Druid SQL Parser 是阿里巴巴开源的 SQL 解析和语法分析工具,支持多种数据库类型,包括 Oracle 数据库。如果在使用 Druid SQL Parser 解析 Oracle 语句时出现错误,可能是由于以下原因之一:
语法错误。在使用 Druid SQL Parser 解析 Oracle 语句时,需要确保语法正确,并遵循 Oracle 数据库的语法规范。可以使用 SQL 调试工具或者其他方式检查语法错误,并进行修正。
版本不匹配。在使用 Druid SQL Parser 解析 Oracle 语句时,需要使用与 Oracle 数据库版本匹配的解析器。如果使用的解析器版本不匹配,可能无法解析语法或出现错误。
配置错误。在使用 Druid SQL Parser 解析 Oracle 语句时,需要正确配置解析器的参数和选项。例如,需要指定解析器的数据库类型、字符集、保留字等。如果配置错误,可能会导致解析出错。
如果您遇到 Druid SQL Parser 解析 Oracle 语句时出现错误的情况,可以尝试以下几个方面进行处理:
检查语法错误。可以使用 SQL 调试工具或者其他方式检查语法错误,并进行修正。
检查解析器版本。需要确保使用的解析器版本与 Oracle 数据库版本匹配。
检查解析器配置。需要正确配置解析器的参数和选项,以确保解析器能够正确解析语法。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。