DBD :: Oracle导致系统调用损坏?

时间:2009-07-22 02:52:15

标签: perl dbi dbd

看到一些奇怪的行为,即连接到Oracle数据库,然后调用外部函数,$的值?总是-1 问题机器运行标准的AIX5.3,DBD :: Oracle 1.20和DBI 1.602。

#!/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:Oracle 1.22和DBI 1.607。但是,查看这些模块的更改日志,我看不到任何与此相关的内容。 除了升级DBD之外我还可以尝试进一步的任何想法:Oracle和DBI(hesitent直接这样做,因为这是一台生产机器)。

2 个答案:

答案 0 :(得分:1)

来自perldoc -f system

  

返回值-1表示无法启动程序或wait(2)系统调用错误(检查$!原因)。

系统调用看起来不再是exec pwd程序了。尝试将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;
}

答案 1 :(得分:0)

我意识到这个帖子已经过了几个月,但由于我遇到了同样的问题,我会详细介绍我的解决方法,让任何偶然发现你的帖子。

不同版本的Oracle OCI库分别处理SIGCHILD(例如,我有11gR2而不是11gR1的问题)。如果您通过更改

避免使用遗留连接

DBI-> connect('dbi:Oracle:','pwd','pwd');

DBI-> connect('dbi:Oracle:','pwd','pwd');

你会发现你的问题消失了。当然,您可能不希望通过听众进行连接,但我没有解决方案......