サイトマップ

dbUnit - OracleのDATE型

dbUnitを使ってOracleデータベースからExcelにデータをexportしようとしたところ、DATE型のカラムの内容が単なる数字になってしまう。 どうやら、UNIXのEpoch Time的なものとして出力されているようだ。

ところが、逆にExcelからOracleにデータをimportしようとすると、DATE型のカラムは

'yyyy-MM-dd HH:MI:SS'

のような形式でなくてはならない。つまり、Oracle⇔Excel間でダイレクトにデータのやりとりができないということになる。

検索してみると、Excel側のマクロで変換するという方法はヒットしたが、あまり汎用的とはいえない。 何か方法はないものかとdbUnitのソースコードを追っかけてみる。

どうやら、DataTypeFactoryを与えてやればうまくいきそうな気がする。そこで

MyOracleDataFactoy.java:

import java.sql.Types;
 
import org.dbunit.dataset.datatype.DataType;
import org.dbunit.dataset.datatype.DataTypeException;
import org.dbunit.ext.oracle.OracleDataTypeFactory;
 
public class MyOracleDataTypeFactory extends OracleDataTypeFactory {
 
	@Override
	public DataType createDataType(int sqlType, String sqlTypeName)
			throws DataTypeException {
		if (sqlType == Types.DATE) {
			return DataType.VARCHAR;
		} else if (sqlType == Types.TIMESTAMP) {
			return DataType.VARCHAR;
        } else {
        	return super.createDataType(sqlType, sqlTypeName);
        }
	}
 
}

呼び出し元:

	Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection conn = DriverManager.getConnection("*****", "*****", "*****");
 
	IDatabaseConnection iconn =  new DatabaseConnection(conn, "******");
	DatabaseConfig config = iconn.getConfig();
	config.setProperty(
		DatabaseConfig.PROPERTY_DATATYPE_FACTORY, 
		new MyOracleDataTypeFactory());
 
	IDataSet dataset = con.createDataSet(new String[] { テーブル名... });
	XlsDataSet.write(dataset, new FileOutputStream(Excelファイル名));

みたいにしてやると、ちゃんと日付の文字列として出力されるようになった。ちなみに、OracleのDATE型はdbUnit上ではTypes.TIMESTAMPと判断されている。

 
research/1353645181.txt · 最終更新: 2012/11/23 13:33 by Kazuyuki Matsuda
特に明示されていない限り、本サイトの内容は次のライセンスに従います:Copyright(C) 2011 Shorindo, Inc. All Rights Reserved
Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki