从Perl脚本中维护外部shell环境

时间:2011-10-04 12:39:18

标签: perl bash db2 environment-variables

我有一个Perl脚本需要调用IBM db2来处理一些命令。麻烦的是每次调用都会破坏db2连接

这不起作用:

$> 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脚本并执行它,但直接执行它会更好。有办法吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

db2的每个单独调用必须重新连接才能对数据库执行任何操作,并且当调用结束时,连接将终止。因此,您的观察行为是可以预期的。

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

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