Groovyでテーブルのデータを取得したい(2)
GroovyでOracleデータベースに接続して、データを取得するサンプルです。
import java.text.* def sql = groovy.sql.Sql.newInstance( 'jdbc:oracle:thin:@localhost:1521:ORCL','username','password','oracle.jdbc.driver.OracleDriver') def username = "create_user" SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss") sql.eachRow("SELECT table_name FROM user_tables WHERE table_name LIKE 'BIZ_AB_%'"){ rs-> def rows = sql.rows("SELECT * FROM " + rs.table_name +" WHERE create_user_cd ='" + username + "'") if( rows.size() > 0 ){ def f = new File(rs.table_name+".csv").newWriter("Shift_JIS") boolean isWroteHeader = false for(r in rows){ r["CREATE_DATE"] = sdf.format(r["CREATE_DATE"].dateValue()) r["RECORD_DATE"] = sdf.format(r["RECORD_DATE"].dateValue()) if(!isWroteHeader){ f.writeLine( r*.key.join(",") ) isWroteHeader = true } f.writeLine( r*.value.join(",") ) } f.close() } }
前回のVBAのようにExcelに書き出す方式ではなく、まずはCSVファイルに出力する方式にしました。
簡単に書ける上、コードが短いのですっきりします。
OracleのTimeStamp型が変換しないとオブジェクトの文字列になってしまうため、変換しています。
調べてみると、DataSet型というものがあって、
def rows = sql.rows("SELECT * FROM " + rs.table_name +" WHERE create_user_cd ='" + username + "'")
は、
//def mySet = sql.dataSet("SELECT * FROM " + rs.table_name).findAll{ it.create_user_cd == ${username} } ←間違い(^^; def mySet = sql.dataSet(rs.table_name).findAll{ it.create_user_cd == ${username} }
といったような書き方ができるらしいのですが、以下のエラーが表示され、どうしてもうまくいきません。。。
Caught: groovy.lang.GroovyRuntimeException: Could not find the ClassNode for MetaClass:
org.codehaus.groovy.runtime.metaclass.ClosureMetaClass@1142196[class DbTools$_test2_closure4]
検索してみると、http://jira.codehaus.org/browse/GROOVY-2450 がヒットするのですが、このチケットはクローズされています。
他のGroovy関連のページでは、DataSetのfindAllは沢山見かけるのですが、皆さんは正常に実行できているのでしょうか。。。
最初は、Groovyのバージョンがいけないのだと思い、最新安定バージョンの1.7.10を実行してNG。
1.5.4/1,5.8もNG。さらに1.8.0-RC4まで試して全部NG。
簡単なSELECT操作とINSERT操作であれば、DataSetを使用したら簡単そうなので、ぜひ使用したいところなんですが。。。
何か情報が分かりましたらUPしたいと思います。
今度は、EXCELへ出力するように改造すべく、Scriptomにチャレンジする予定です。