2013-03-25 30 views
2

我正在使用Groovy的groovy.sql.Sql來查詢Oracle 10g數據庫。它工作得很好,除了一個奇怪的問題,我一直在與firstRow。基本上,我每次使用它時都會得到一個java.sql.SQLException: Invalid column type - eachRow雖然可以。groovy.sql.Sql在調用firstRow時與Oracle 10g錯誤

有沒有其他人遇到過這個問題?如果是這樣,是否有解決方法?這發生在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" 

這導致下面的輸出:

>>groovy firstRowTest.groovy 
Item A = 640 
Item B = 90 
Item C = 90 
25-Mar-2013 13:49:24 groovy.sql.Sql$AbstractQueryCommand execute 
WARNING: Failed to execute: 
       select ITEM_A, ITEM_B, ITEM_C from MY_TBL where ITEM_D = 1233 
       because: Invalid column type 
Caught: java.sql.SQLException: Invalid column type 
java.sql.SQLException: Invalid column type 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
     at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:9262) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8843) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9565) 
     at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:9548) 
     at firstRowTest.run(firstRowTest.groovy:30) 

回答

2

firstRow不採取任何封閉作爲參數,你可以看到,如果這給出了同樣的錯誤?

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

我懷疑,它試圖call this method,並通過關閉作爲PARAMS

1

我相信你可以說:

sql.firstRow(query).with{row -> 
    itemA = row.ITEM_A 
    itemB = row.ITEM_B 
    itemC = row.ITEM_C  
} 

這並不讓你在上一個封閉通從firstRow方法返回的GroovyRowResult。

+0

這也可以工作(並且更具可讀性),但如果您的查詢返回0行,則會得到NullPointerException。 – sigint 2013-09-08 17:29:41