2

Groovyのgroovy.sql.Sqlを使用してOracle10gデータベースにクエリを実行しています。私がfirstRowで抱えていた奇妙な問題を除いて、それは非常にうまく機能します。基本的に、java.sql.SQLException: Invalid column type使用するたびに取得しますが、 eachRowは機能します。

他の誰かがこれに遭遇しましたか?もしそうなら、回避策はありますか?これは、Groovy1.8.8および2.1.1で発生します。私はこれまでWindowsXPでこれを試しただけです。

コード例:

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)
4

2 に答える 2

2

firstRowクロージャをパラメータとして取りませんが、これで同じエラーが発生するかどうかを確認できますか?

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

このメソッドを呼び出そうとしていて、Closureをparamsとして渡そうとしているのではないかと思います。

于 2013-03-25T14:15:41.187 に答える
1

私はあなたが言うことができると信じています:

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

これにより、firstRowメソッドから返されるGroovyRowResultのクロージャーを渡すことができます。

于 2013-03-26T15:19:38.763 に答える