2009-07-22 118 views
1

看到一些奇怪的行爲,即連接到Oracle數據庫,然後調用外部函數,$的值?總是-1。
問題機器運行標準AIX5.3,DBD :: Oracle 1.20和DBI 1.602。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。不過,查看這些模塊的更改日誌,我看不到任何與此相關的內容。 除了升級DBD之外,我可以嘗試的其他任何想法都可以嘗試:Oracle和DBI(因爲這是一臺生產機器,所以heintent立即執行此操作)。

回答

1

perldoc -f system

-1返回值指示失敗來啓動程序或wait(2)系統調用(檢查$!的原因)的誤差。

看起來系統調用不再能夠execpwd程序了。試着改變你的system來電:

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 2009-07-23 10:12:11

+0

基於該錯誤消息,找到以下鏈接,似乎是相同的行爲: http://rt.cpan.org/Public/Bug/Display.html?id=16548 – Patrick 2009-07-23 10:14:55

0

我意識到這是張貼在事後數月,但因爲我也遇到了同樣的問題,我將詳細介紹我的解決辦法的人誰在你的崗位絆倒。

不同版本的Oracle OCI庫分別處理SIGCHILD(例如,我對11gR2有問題,但不是11gR1)。如果您通過更改

以避免使用遺留連接DBI-> connect('dbi:Oracle:','pwd','pwd');

DBI->連接( 'DBI:甲骨文:', 'PWD', 'PWD');

你會發現你的問題消失了。當然,你可能不想通過聽衆連接,但我沒有解決方案...