2011-10-04 55 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腳本?然後,您可以維護連接並重新使用現有連接,只要您想要。