Ruby で処理した結果を DB に格納するまでの顛末

そもそもやりたかったこと

 今開発しているツールは、複数のファイルから取得した情報を整理して用意されたテーブルに格納する、というもの。既存のプログラムから一部機能を流用できたため、開発言語は Ruby 、 DB は Oracle Database 。

 主に自分自身の備忘を目的として、どう考えて結局どうしたのかを記しておく。

RubyOracle にアクセスする方法

 まずは軽く調べてみた。 Oracle のインタフェースは ruby-oci8 がある。しかし ruby-oci8 は Oracle クライアントが必要、という制約があった。

 ツールのユーザは限定されているが数は少なくない想定で、彼らの環境には RubyOracle クライアントもない。 Ruby については他のツールの都合で遅かれ早かれインストールされるとしても、今回作成するツールのために Oracle クライアントをインストールする、というのは抵抗を覚える人も少なくないだろう。なぜなら、彼らは Java で開発しており、 Oracle への接続は Thin Driver を用いているからだ。 Ruby にも Thin Driver があれば良かったのだが、僕には見つけられなかった。

Thin Driver を使うために JRuby を採用する

 Ruby で使える Thin Driver は見つけられなかったが、 Java では普段から Thin Driver にお世話になっている。 Java で使えるということは、 JRuby でも使える、ということだ。

 ということで、 Ruby で書いていたコードに、

require 'java'

を追加。

 また、 rubygems で取得したライブラリをそのまま使えるようにするために、 JRuby の gem install が必要であることに注意。普通に gem を実行すると Ruby の gem が実行されてしまう( PATH の設定の問題)ので、 JRuby のインストール先の bin ディレクトリに格納されている gem コマンドでインストールする必要がある。

コマンドプロンプトで標準出力が文字化け

 今回のツールは Windows で作成していたが、標準出力(正確には標準エラー)が文字化けして、デバッグに苦労した。出力されたもじれつが UTF-8 であるのに対し、コマンドプロンプトは Shift-JIS であるため、文字化けが発生するのは当然なのだが、解消までに時間がかかってしまった。

 Ruby からの出力自体は Kconv文字コードを指定すれば良いのだが、 JRuby から呼んでいる Oracle から返ってくるエラーの文字コードを変更する方法がわからなかった。 エラーの内容がわからないとデバッグの難易度が一気にあがるので、なんとかしてエラーの内容を理解できるようにしたかった。

コマンドプロンプト文字コードを変更する

 ツールが出力する文字列の文字コードを変える方法がわからなかったので、思いきって、コマンドプロンプト文字コードを変更した。

chcp 65001

 これでコマンドプロンプト文字コードUTF-8 になり、ツールからの出力結果が読めるようになった。

 ちなみに、文字コードを Shift-JIS に戻すには、

chcp 932

とすればよい。

ojdbc14 の jar を JRuby で使う

 JDBC の jar もなしに Oracle にアクセスすることはできないので、 jar を認識してもらう必要がある。普通にファイルパスを require してみたが、これはダメ。どうやら対象の jar は JRuby の lib ディレクトリに格納されている必要があるらしい。ファイルをコピーしたところ、正常に動作した。

以上

 ここまできて、やっとテーブルへの insert が正しく動作することを確認できた。大したことはやってませんが、同じところで二度と嵌らぬようにここに残しておきます。