groovy.sql.sql使用Oracle 10g调用第一行时出错

groovy.sql.sql使用Oracle 10g调用第一行时出错,oracle,groovy,Oracle,Groovy,我正在使用Groovy的Groovy.sql.sql查询Oracle 10g数据库。它工作得很好,除了我一直遇到的一个奇怪的问题。本质上,每次使用时,我都会得到一个java.sql.SQLException:Invalid column type,但它仍然有效 还有其他人碰到过这个吗?如果是,是否有解决办法?Groovy 1.8.8和2.1.1都会出现这种情况。到目前为止,我只在Windows XP上尝试过这个 示例代码: import groovy.sql.Sql // ojdbc14_ve

我正在使用Groovy的Groovy.sql.sql查询Oracle 10g数据库。它工作得很好,除了我一直遇到的一个奇怪的问题。本质上,每次使用时,我都会得到一个
java.sql.SQLException:Invalid column type
,但它仍然有效

还有其他人碰到过这个吗?如果是,是否有解决办法?Groovy 1.8.8和2.1.1都会出现这种情况。到目前为止,我只在Windows XP上尝试过这个

示例代码:

import groovy.sql.Sql

// ojdbc14_ver_10_2_0_4.jar and orai18n_ver_10_2_0_4.jar is in the classpath
// Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit

sql = Sql.newInstance("jdbc:oracle:thin:@dbhost:1500:DBNAME", "user", "pass", "oracle.jdbc.driver.OracleDriver")


// This should return only one row (verified by querying the database).
// You can use any query that returns only one row.
String query = "select ITEM_A, ITEM_B, ITEM_C from MY_TBL where ITEM_D = 1233"

Long itemA = 0L
Long itemB = 0L, itemC = 0L

Integer rowCount = 0
sql.eachRow(query) { row ->
    itemA = row.ITEM_A
    itemB = row.ITEM_B
    itemC = row.ITEM_C
    rowCount++
}
assert rowCount <= 1 // 0 or 1 rows returned

println "Item A = $itemA"
println "Item B = $itemB"
println "Item C = $itemC"
// works fine

// now we have a problem:
sql.firstRow(query) { row ->
    itemA = row.ITEM_A
    itemB = row.ITEM_B
    itemC = row.ITEM_C
}
println "Item A = $itemA"
println "Item B = $itemB"
println "Item C = $itemC"

firstRow
不将闭包作为参数,您能看到这是否会产生相同的错误吗

def frow = sql.firstRow(query)
itemA = frow.ITEM_A
itemB = frow.ITEM_B
itemC = frow.ITEM_C

我怀疑,它正在试图,并以参数的形式通过闭包,我相信你可以说:

sql.firstRow(query).with{row ->
    itemA = row.ITEM_A
    itemB = row.ITEM_B
    itemC = row.ITEM_C     
}
这确实允许您在从firstRow方法返回的GroovyRowResult上传递闭包。

这也可以工作(并且可读性更好),但是如果查询返回0行,您将得到NullPointerException。
sql.firstRow(query).with{row ->
    itemA = row.ITEM_A
    itemB = row.ITEM_B
    itemC = row.ITEM_C     
}