2011-10-04 2 views
0

일부 명령을 처리하기 위해 IBM db2를 호출해야하는 Perl 스크립트가 있습니다. 문제는 DB2 연결이 작동하지 않는Perl 스크립트 내에서 외부 쉘 환경 유지

각 호출에 사방되는 것을 :

$> 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"`; 

해결 방법은 펄에서 떠들썩한 파티 스크립트를 생성하고 실행하는 것입니다,하지만 그것을 할 더 좋은 것 직접. 방법이 있습니까?

+0

마지막 예제에서 두 명령은 동일한 서브 쉘에서 실행되며 동일한 환경을 가져야합니다. 'db2'는 실행 가능한 프로그램의 이름 대신에 별명입니까? – mob

+0

두 번째 예제가 나를 위해 일했습니다. 나는 리눅스와 AIX에서 그것을 시도했다. 그러나 시스템에 설치된 db2profile 쉘 스크립트를로드했습니다. 그거 했니? –

+0

파이프를'some_filter'에 놓았습니다. 파이프가 깨졌습니다. 편집 됨. – spraff

답변

2

각각 별도의 db2 호출은 데이터베이스와 관련된 작업을 수행하기 전에 새로 연결해야하며 호출이 끝나면 연결이 종료됩니다. 그래서 당신의 관찰 된 행동이 예상됩니다.

Perl을 사용하는 경우 DBI을 적극 고려하십시오.

이것이 옵션이 아니라면, 명령을 작성하는 파이프와 그에 이어지는 파이프가있는 서브 프로세스로 Perl 스크립트에서 db2 프로그램을 실행하는 것을 고려해야합니다. db2에 명령을 작성한 다음 반환 된 데이터를 구문 분석하여 응답 완료 및 오류 메시지 및 데이터 처리시기를 알 수 있어야합니다. 모듈이 있어야합니다 (코어 모듈 IPC::Open3 또는 IPC::Open2).

2

쉘 스크립트 대신 DBI을 사용하지 않는 이유는 무엇입니까? 그런 다음 원하는만큼 오래 연결을 유지하고 기존 연결을 재사용 할 수 있습니다.

관련 문제