所以我看到了很多关于这个SQL错误的线索,但是我没有看到解决这种特殊情况的方法。长话短说,我有一个消息处理服务器,它在传递有效负载之前在有效负载上执行一些脚本。这些脚本是groovy,我在日志中收到错误如下:
WARNING groovy.sql.Sql [process-1{channel}] -
Failed to execute:
select column
from table
where field1 = ?
and field2 in ([468001])
because: ORA-00936: missing expression
这是日志文件。当我实际打印出由groovy创建的字符串时,它包含以下内容:
select column
from table
where field1 = 2.5249083E7
and field2 in (groovy.sql.Sql$35@f7326f4e)
我认为科学记数法只是groovy打印类型的方式,并且展开会创建一个不能很好地打印的对象。
创建此错误的实际groovy代码是
sql.eachRow("""
select column
from table
where field1 = $var1
and field2 in (${Sql.expand(varList2.join(','))})
""") { row ->
给我的部分是这个脚本中的这个确切的代码在不同的groovy脚本中的不同点上执行得很好。它实际上是复制和粘贴的(虽然我没有写它,这是我少数常规体验之一,所以这并不意味着很多)。如果有人有任何提示,那将是很棒的。
我很高兴有人告诉我,我是个白痴,为什么。这是一个如此简单的错误,我假设我错过了一些明显的东西。我已经重命名了变量和表/列名称,但我可以向您保证拼写正确并复制/粘贴填写的版本返回数据。
答案 0 :(得分:0)
根本原因是由@tim_yates和@Alex诊断出来的。 无论如何,我建议使用不同的方法来绑定IN LIST(与Hibernate使用的方法相同)。
groovyCon.eachRow
('select * from mytab where x in (' + varList2.collect{'?'}.join(',') + ')',varList2)
{println it}
这会导致一个SQL字符串
select * from mytab where x in (?,?)
这不仅是SQL注入证明,而且更有效,因为具有相同IN列表基数的查询可以在不进行硬解析的情况下重复使用。
此外,在尝试传递错误的数据类型时,您会遇到异常:
Caught: java.sql.SQLException: Invalid column type