Grails サービスにこの Groovy 疑似スクリプトがあります。
sql.eachRow("""
select id, col1, col2
from mytab
where col1 is null or col2 is null
"""
){
... some code to produce c1, c2 here ...
sql.execute("""
update mytab
set col1 = ${c1}, col2 = ${c2}
where id = it.id
""")
}
問題は、更新が eachRow ループの最後にのみ DB にコミットされることです。sql.execute 呼び出しで更新を正確にコミットしたかったのです。
sql.eachRow の直前に sql.resultSetConcurrency = GroovyResultSet.CONCUR_UPDATABLE を挿入しようとしましたが、更新はループの終了後にのみコミットされ続けます。また、sql.execute() の直後に sql.commit() が呼び出されましたが、これも成功しませんでした。
SQL 接続は DBCP Tomcat データソースから来て、Oracle 8.1.7 データベースにアクセスします。
ありがとうございました!