代码之家  ›  专栏  ›  技术社区  ›  Omnipresent

为什么我一直在用groovy查询以运行Oracle?

  •  2
  • Omnipresent  · 技术社区  · 16 年前

    我想做一个 in 语句中的值来自数据库,然后在另一个查询中使用它们。DB是Oracle

    例子:

    我已经绕着这个转了很久了。我需要一些帮助:

    Groovy代码:

    def myList = []
    def myQuery = "select USER_ID from USER_TABLE where rownum < 3"
    println myQuery
    sql_dw.eachRow(myQuery) {
        myList.add("'"+it.USER_ID+"'")
    }
    println myList
     myQuery = "select * from USER_TABLE where USER_ID in (${myList.join(",")})"
     println myQuery
    def myRow =     sql_dw.firstRow(myQuery);
    if (myRow == null)
        println "OMG its null!!"
    

    输出为:

    select USER_ID from eiv.USER_TABLE where rownum < 3
    ['5xsubmit', 'A10165']
    select * from USER_TABLE where USER_ID in ('5xsubmit','A10165')
    OMG its null!!
    

    我不知道是什么造成的!!

    如果我在这里工作的话,一切都很好 myList 具有硬编码值,如

    def myList = ["'5xsubmit'", "'A10165'"]
    

    另外,复制粘贴查询会在数据库中返回结果!!

    更新

    谷歌搜索后,发现了这个 link 所以我们必须使用准备好的语句。将研究如何相应地更改代码。

    1 回复  |  直到 16 年前
        1
  •  0
  •   tim_yates    16 年前

    如果您将行更改为:

      myQuery = "select * from USER_TABLE where USER_ID in (${myList.join(",")})" as String
    

    这应该会阻止groovy sql变得聪明,并试图将gstring转换为PreparedStatement(正如您指出的,这不起作用)。