2009-07-22 8 views
1

は、Oracleデータベースに接続することにより、いくつかの奇妙な行動を見て、その後、外部関数を呼び出し、$の値は?常に-1です。
問題のマシンは、DBD :: Oracleの1.20およびDBI 1.602で、標準AIX5.3を実行しています。DBD :: Oracleがシステムコールの破損を引き起こしていますか?

#!/usr/bin/perl -w 
use DBI; 

CORE::system "pwd"; 
print "Before connect: $?\n"; 
DBI->connect('dbi:Oracle:', 'pwd', 'pwd'); 
print "Before system: $?\n"; 
CORE::system "pwd"; 
print "After system: $?\n"; 
CORE::system "pwd"; 
print "After system: $?\n"; 

Before connect: 0 
Before system: 0 
/usr/local/bin 
After system: -1 
/usr/local/bin 
After system: -1 

これは、異なるAIX 5.3マシンからの結果である、私が見ることができる唯一の違いは、それがDBDを実行していることである:オラクル1.22およびDBI 1.607。しかし、それらのモジュールの変更ログを見ると、それに関連するものは何も見えません。 OracleとDBI(これは、生産機械であるとすぐにそれを行うにはhesitent):私はDBDをアップグレードする以外試すことができ、さらに、物事のため 任意のアイデア。 perldoc -f systemから

答えて

1

:-1の

戻り値は、プログラムまたはwait(2)システムコール(理由$!を検査)のエラーを起動に失敗したことを示しています。

システムコールがexecpwdプログラムにもうできないようです。私はこの投稿は、数ヶ月事実の後であるが、私は同じ問題に遭遇しておりますので、私はあなたのポストにつまずく誰のための詳細私の回避策をよ実現

my $rc = system "pwd"; 
if ($rc == -1) { 
    die "system call failed: $!"; 
} elsif ($rc & 0b0000_0000_0111_1111) { 
    die "system call died due to signal ", $rc & 0b0000_0000_0111_1111; 
} elsif ($rc & 0b1111_1111_0000_0000) { 
    warn "system call returned non-zero exit code: ", $rc >> 8; 
} 
+0

/usr/local/bin システムコールが失敗しました:子プロセスはありません。 ./test.pl 7行目。 実際のpwdコマンド自体は完了しています(/ usr/local/binを出力しています)。 – Patrick

+0

そのエラーメッセージに基づいて、次のリンクが見つかりました:同じ動作であるようです。 http://rt.cpan.org/Public/Bug/Display.html?id=16548 – Patrick

+1

コメントの1つに基づいて私は、接続の後に以下を追加しました: $ SIG {CHLD} = 'DEFAULT'; これは、余分なエラーメッセージを取得する方法についての情報のおかげで、修正(または問題を回避する)ようです。 – Patrick

0

:にあなたのsystemの呼び出しを変更してみてください。 OracleのOCIライブラリが別途SIGCHILDを扱うの

異なるバージョン(例えば、私はあなたの11gR2のに問題はなく、11gR1のを持っています)。あなたは

DBI-を変更することにより、接続を遺す使用を避ける場合>接続( 'DBI:オラクル:'、 'PWD' 'PWD');

DBI->接続( 'DBI:オラクル:'、 'PWD'、 'PWD');

あなたはあなたの問題を見つけることができますが表示されなくなります。もちろん、リスナーを経由して接続したくないかもしれませんが、その解決策はありません。

+1

あなたがリストする2つのステートメントの間に違いは見られません。私は何かを見逃してしまったのですか、それともタイプミスですか? – Patrick

+0

DBI-> connect( 'dbi:Oracle:tnsconnect'、 'pwd'、 'pwd');と聞いて、リスナーを通して言えば、2番目のものは であるはずです。 ここで、tnsconnectは接続文字列です。 –

関連する問題