2005-07-12

_ [Ruby] Ruby de DB

久々にRubyの事書くので、ちょっと緊張。 でもあくまでメモ書きなので、もし間違ってたら教えてください〜。

今日は、「perl(CGI) から Rubyスクリプトを呼び出し、また perl(CGI)に戻る」というコードを書きました。 このperlのCGIへの機能追加の要望だったので、面倒だから最初からRubyで書き直そうと思ったのですが、perlのコードは残しておかなければならなかったため、機能追加の部分はRubyで書くことにしました。

機能追加の部分は、oracleに接続して、ほしいデータを取得、それをファイルに出力するという簡単なスクリプトです。*1

require "oci8"
require "dbi"

user = Array.new
DBI.connect('dbi:OCI8:dbname', 'userid', 'passwd') do |dbh|
  begin
   sth = dbh.prepare('SELECT NAME FROM T_TABLE WHERE MEMBER = ?')
   sth.execute(number)
   while row = sth.fetch do
	user.push(row[0])
   end
   sth.finish
 rescue DBI::DatabaseError => e
      puts "Error code: #{e.err}"
      puts "Error message: #{e.errstr}"
      exit 1
 rescue => ex
      puts ex.message
      exit 1
 end
end
File.open("./data.tsv","w"){|file|
   file.print(_user.join("\t")+"\n")
}
exit 0

私にとって、このスクリプトで初めてデータベースを使ってみたということもあって、結構苦戦。なぜなら、

oracleに接続できない.....

このスクリプトを手動で動かしたところ、実行ユーザの環境変数に、ORACLE_SID,ORACLE_OWNER,ORACLE_HOMEを設定してみると接続できましたが、CGI経由では接続できず。

ということで、Rubyのスクリプトに環境変数を設定してみたのですが、それでも接続できない。

oracleのエラーは、

  • ORA-06401: NETCMN: ドライバの指定文字が無効です。
  • ORA-12154: TNS: サービス名を解決できませんでした。

oracleはもちろんDBにすら触ったことのない私にはお手上げ状態だったので、他の人に相談。結構苦戦して3時間後*2に解決。

原因は、「NET8の設定ができてなかったから。」とのこと。 ということで、tnsnames.oraを書き換え、無事終了。

ということでメモを一筆 〆(_ _)

  1. Ruby/DBIでoracleに接続するには、Net8がないと動かないらしい。
  2. (Perl/DBIはNet8がなくてもいいらしいです。って本当かな〜)

他のDBのことはまったく分からないのでこれを機に勉強するのもいいかも。

*1 ここに書いたスクリプトは簡潔に書いただけなので、実際はもっと複雑です。

*2 対象のサーバのことをなにも知らないので、結構苦労されたようです。

[]

«前の日記(2005-06-30) 最新 次の日記(2005-08-01)»