人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perlのMOD_PERL2の環境で、DBD::OracleからOracleに接続しようとすると以下のエラーが出力されます。

DBI connect('Host=localhost;SID=XE','user',...) failed: ERROR OCIEnvNlsCreate. Check ORACLE_HOME env var, NLS settings, permissions, etc. at test.cgi line 66

不思議なことにMOD_PERL2でない環境ではエラーになりません。

色々試してみたのですが、自分の力ではどうにも解決できそうになく、どんな些細なことでも結構ですので、どなたか助言して頂けないでしょうか?

どうぞ宜しくお願いします。

以下、環境です。

OS: Fedora7
DB: OracleXE
Perl: 5.8.8
DBI: 1.605
DBD::Oracle: 1.21
Apache::DBI 1.07

%ENVの実行結果(一部抜粋)
ORACLE_HOME /usr/lib/oracle/xe/app/oracle/product/10.2.0/server
NLS_LANG JAPANESE_JAPAN.JA16EUC
ORACLE_SID XE
TWO_TASK XE
ORACLE_BASE /usr/lib/oracle/xe/app/oracle
LD_LIBRARY_PATH /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib
MOD_PERL mod_perl/2.0.3

なお以前の似たような質問は既に確認済みです。
http://q.hatena.ne.jp/1128054654

●質問者: jhappyclub
●カテゴリ:インターネット ウェブ制作
✍キーワード:2.0 Apache AT CGI CONNECT
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● shintabo
●0ポイント

# mod_perl環境でない場合に実行するユーザと、

# mod_perl環境での実行ユーザ(httpd?apache?)は一緒ですか?

# 通常kickされるPerl-CGIと、mod_perlでは実行ユーザが違います

# mod_perl環境でない場合に実行するユーザをapacheのユーザにして動作しますか?

◎質問者からの返答

回答ありがとうございます。

> # mod_perl環境でない場合に実行するユーザと、

> # mod_perl環境での実行ユーザ(httpd?apache?)は一緒ですか?

どちらもnobodyで試しました。

> # 通常kickされるPerl-CGIと、mod_perlでは実行ユーザが違います

> # mod_perl環境でない場合に実行するユーザをapacheのユーザにして動作しますか?

httpd.confでapacheユーザに変更して、DBD::Oracle.pm で、Oracle OCI の logon関数を呼び出す直前に、getpwuid($>) を実行してみたところ、どちらの環境もapacheユーザで動作も同じでした。

getpwuid($>)を`id`に変更してもどちらの環境も同じapacheユーザでした。なおnobodyもapacheも第2グループにdbaグループを設定しています。

おかしい点がありましたらご指摘頂けると幸いです。宜しくお願いします。


2 ● shintabo
●100ポイント ベストアンサー

RETRY:

# 確かに数年前、mod_perlとDBD::Oracleのバグはあったように思いますが

# せっかくなので、XEを入れて試してみました

# http://modperlis.bounceme.net/work/ora.cgi

# 頭に出してるHashを見ると、接続できているようです

#!/usr/bin/perl

use strict;

use warnings;

use DBI;

my $dsn = 'dbi:Oracle:XE';

my $user = 'xxxxx';

my $password = 'xxxxx';

my $dbh = DBI->connect($dsn, $user, $password) or die $!;

print "Content-type:text/html\n\n";

print "$dbh<br>\n";

foreach (keys %ENV) {

print "$_ => $ENV{$_}<br>\n";

}

__END__

# もしかして、コンテンツハンドラ以外ですか?

# 一度、rootでコマンドラインから実行できるように修正して

# httpd.confに以下を追加して、restartするとどうですか?

PassEnv PATH LD_LIBRARY_PATH ORACLE_SID ORACLE_HOME

/usr/local/apache2/bin/apachectl restart

# できれば、そのソースを教えてもらえますか?

goto RETRY;

◎質問者からの返答

回答ありがとうございます。

恥ずかしいことにサーバーをリブートしたことで、解決してしまいました。

長らくリブートしていなかったので、古い環境変数を参照していたのかもしれません。

ご迷惑おかけしました。

サンプルの環境まで作って頂いて本当にありがとうございました。助かりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ