Поддерживать внешнюю оболочку из скрипта Perl - PullRequest
0 голосов
/ 04 октября 2011

У меня есть сценарий 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"`;

Обходной путь может состоять в том, чтобы сгенерировать bash-скрипт из Perl и выполнить его, но было бы лучше сделать это напрямую.Есть ли способ?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Каждый отдельный вызов db2 должен подключаться заново, прежде чем он сможет что-либо делать с базой данных, а когда вызов завершается, соединение прерывается. Таким образом, ваше наблюдаемое поведение следует ожидать.

Если вы используете Perl, серьезно подумайте об использовании DBI .

Если это не вариант, то вам нужно рассмотреть запуск программы db2 из вашего Perl-скрипта как подпроцесса с ведущим к нему каналом, на котором вы пишете команды, и каналом, ведущим назад от него. Вам нужно будет записать свои команды в db2, а затем проанализировать возвращенные данные, чтобы вы могли определить, когда они закончили отвечать, и обработать сообщения об ошибках и данные. Для этого должны быть модули (возможно, основной модуль IPC :: Open3 или IPC :: Open2 ).

2 голосов
/ 04 октября 2011

Почему бы не использовать DBI вместо сценария оболочки? Затем вы можете поддерживать соединение и повторно использовать существующее соединение столько времени, сколько хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...