2011-10-04 58 views
0

我有一个Perl脚本,需要调用IBM db2来处理一些命令。麻烦的是DB2连接在每次调用重挫在Perl脚本中维护外部shell环境

这不起作用:

$> db2 connect to foo 
$> perl -e 'print `db2 list tables for schema bar|some_filter`;' 

也没有这样的:

$> perl -e 'print `db2 connect to foo`; print `db2 list tables for schema bar|some_filter`;' 

也没有这样的:

$> perl -e 'print `db2 connect to foo && db2 list tables for schema bar|some_filter`;' 

在每种情况下,连接在第二个命令执行时都会丢失。

这工作:

#!/usr/bin/perl 
print `db2 connect to foo`; 
print `db2 list tables for schema bar`; 

但这并不:

#!/usr/bin/perl 
print `db2 connect to foo`; 
print `db2 "select count * from bar"`; 

一种解决方法将产生从Perl中的bash脚本并执行,但它会更好做直。有没有办法?

+0

在上例中,这两个命令在同一个子shell中运行,并且必须具有相同的环境。 'db2'是别名,而不是可执行程序的名称? – mob

+0

你的第二个例子为我工作。我在Linux和AIX下试过了。但是,我已经加载了安装在我的系统上的db2profile shell脚本。你做到了吗? –

+0

我将管道排除在'some_filter'上,这会破坏它。编辑。 – spraff

回答

2

db2的每个单独的调用必须在它可以对数据库执行任何操作之前进行重新连接,并且在调用结束时连接将终止。所以你的观察行为是可以预料的。

如果您使用Perl,请认真考虑使用DBI

如果这不是一个选项,那么你需要考虑从你的Perl脚本中运行db2程序作为一个子进程,其中有一个通向它的管道,在这个管道上写入命令和一个从它开始的管道。您需要将您的命令写入db2,然后才能解析返回的数据,以便您可以分辨何时完成响应并处理错误消息和数据。必须有模块(可能是核心模块IPC::Open3IPC::Open2)。

2

为什么不使用DBI而不是shell脚本?然后,您可以维护连接并重新使用现有连接,只要您想要。