当groovy脚本尝试选择时,ORA-00936(缺少表达式)

时间:2016-10-22 21:31:25

标签: oracle groovy

所以我看到了很多关于这个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脚本中的不同点上执行得很好。它实际上是复制和粘贴的(虽然我没有写它,这是我少数常规体验之一,所以这并不意味着很多)。如果有人有任何提示,那将是很棒的。

我很高兴有人告诉我,我是个白痴,为什么。这是一个如此简单的错误,我假设我错过了一些明显的东西。我已经重命名了变量和表/列名称,但我可以向您保证拼写正确并复制/粘贴填写的版本返回数据。

1 个答案:

答案 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