センター試験の日ですね。受験生の方は実力発揮できるようにがんばってください。
おはようございます。渉猟です。
仕事でJAVAバッチ製作で、SQLログ吐き出しができるようにlog4jdbcを使っています。
SQLの処理はPreparedStatementで処理するのですが、とある文章をSetStringで入れようとしたら以下のエラーが発生しました。
【java.sql.SQLException: setStringでは、32766文字未満の文字列のみ処理できます】
setStringは32755文字までしか入らないみたいですね。
なので、バッチが急に動かなくなったので急遽対応することになりました。
ちなみにデータベースはoracleのClobに入れると想定。
上司から「setClobでできるんじゃないの?」と解決案を提示していただいたので、setClobでやろうとしました。
以下抜粋
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement(SQL);
Reader rd = new StringReader(STR);
pstmt.setClob(1,rd);
これで実行したら以下のようなエラーメッセージが出ました。
Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CPreparedStatement.setClob(ILjava/io/Reader;)V
at net.sf.log4jdbc.PreparedStatementSpy.setClob(PreparedStatementSpy.java:908)
実装がないだと・・・・・・?
setClob(1,rd)⇒pstmt.setCharacterStream(1,rd)
に変更しても同様のエラーに・・・・・・
原因をgoogle先生に尋ねても、なかなかいい返事をもらうことができず、ずっと悩んでいました。
そして、ある海外のサイト(URL忘れました;)にて閲覧すると、setCharacterStream(1,rd,STR.length());だといけるとのこと。
早速それで試してみると処理ができるようになりました。
setClobとかはJDK1.6に追加されたものなので、log4jdbcには対応できていないんじゃないかな。
なので、文字数でsetStringができない場合は試してはどうでしょうか。