1

看到一些奇怪的行为,即连接到 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(因为这是一台生产机器而犹豫不决)之外,我可以尝试更多的想法。

4

2 回答 2

1

来自perldoc -f 系统

返回值-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;
}
于 2009-07-22T03:59:03.550 回答
0

我意识到这篇文章是在事后几个月发布的,但由于我遇到了同样的问题,我会为任何偶然发现你的帖子的人详细说明我的解决方法。

不同版本的 Oracle OCI 库分别处理 SIGCHILD(例如,我对 11gR2 有问题,但对 11gR1 没有问题)。如果您通过更改来避免使用遗赠连接

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

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

you'll find your problem goes away. Of course, you may not want to connect by going through the listener, but I don't have a solution for that...

于 2010-01-15T01:38:05.573 回答