2012-03-07 3 views
0

perl에서 연결할 수없는 경우 어떻게 해결할 수 있습니까? 배열에 데이터베이스 이름이 있고 루프에서 물마루가있는 경우 쿼리를 연결하고 연결을 시도하고 연결하려고합니다. 나는 그것을 우리가 가지고있는 형제 서버 모니터링 페이지로 다시보고 할 것이다. 분명히 배열의 모든 것을 검사해야하기 때문에 스크립트가 하나에 연결할 수 없으면 스크립트를 종료하지 않기를 바란다. 지금은 DBI 모듈 상태 메서드를 사용하지만 제대로 작동하는지 모르겠습니다. 누구나 시간을내어 주셔서 감사합니다!perl 스크립트로 여러 데이터베이스에 연결하기

답변

1

코드를 볼 수 있습니까? 난 당신이 명시 적으로 그것을 말하지 않는 DBI->connect()에 대한 호출이 같이 죽을 생각하지 않는다 :

DBI->connect($dsn, $user, $pass) or die "Can't connect: $DBI::errstr\n"; 

심지어 {RaiseError => 1} 자동으로 죽을하지 않습니다 사용 확신 해요. 따라서 or die...으로 전화하는 경우에는하지 마십시오!

는 편집 : 게시 @squiguy 코드를 감안할 때

, 나는 이런 식으로 할 것 :

foreach my $host (@hosts) { 
    $dbh = DBI->connect("dbi:Oracle:; host=$host; port=$port", $username, $password); 
    next unless $dbh; 
    if ($dbh->state()) { 
     # Do stuff with state information 
    } 
} 
+0

'foreach my $ host (@hosts) { $ dbh = DBI-> connect ("dbi : Oracle 호스트; $ 호스트; 포트 = $ 포트", $ 사용자 이름, $ 비밀 번호); if ($ dbh-> state())' 기본적으로 연결을 수행하고 연결되어 있는지 여부를 확인하기 위해 상태를 사용합니다. 이것은 나를 위해 작동하지 않는 것 같습니다. 내가하려는 일을하거나 더 설명해야 할 필요가 있다면 알려주십시오. Thanks – squiguy

+1

연결에 실패하면'$ dbh '가 정의되지 않고'$ dbh-> state()'호출은 치명적 런타임 오류가됩니다. if ($ dbh && $ dbh-> state()) ... '라고 대신 말하십시오. – mob

+0

네, @ mob 답으로 가십시오. 또한 개별 테스트로 분리하여 연결할 수 없거나 상태가 거짓 값을 다시 시도하는지 확인할 수 있습니다. –

0

Perl에서 예외 처리를 찾아야합니다. Perl을 사용하지 않기 때문에 예외 처리를위한 구문을 알지 못하고 온라인에서 쉽게 찾을 수 있어야합니다.

+0

나는 그 일을하는 법에 익숙하지만 계속 진행하기 위해 어떤 예외도 찾을 수 없다. 그들 모두는 끝내는 것처럼 보인다.귀하의 의견을 주셔서 감사합니다 – squiguy

0

내가 배열의 데이터베이스 이름을 가지고 루프에서 그들을 물마루 이동 연결을 시도하고 연결하고 쿼리를 수행하고 연결을 끊으려고합니다.

루핑 중이라면 여러 데이터베이스를 열 필요가 없습니다. 루프에서 데이터베이스를 열고, 물건을 처리하고 닫습니다.

연결할 수없는 경우 어떻게 해결할 필요없이 펄없이 여러 데이터베이스에 연결할 수 있습니까?

나는 이것이 당신의 반복에 있다고 가정하고 있습니다. 오류가 발생할 수있는 Perl 명령을 수행 할 때마다 언제든지 eval을 사용하여 프로그램 실행을 중지 할 수 있습니다. eval 보통 치명적인 오류의 종류를 잡을 것

for my $database (@database_list) { 
    my $dbh; 
    eval { 
     $dbh = DBI->connect($database, $user, $password); 
    }; 
    if (not [email protected]) { 
     yadda, yadda, yadda 
    } 
} 

:

은 당신이 뭔가를 할. [email protected]에 값이 있으면 호출이 실패하고 eval이 오류 설명을 반환했습니다. [email protected]이 비어 있으면 오류가 발생하지 않으며 계속 진행하면됩니다.

기본적으로 DBI는 연결할 수없는 경우 자동으로 종료되지 않습니다. 대신 정의되지 않은 값을 반환합니다. 세트 죽을 프로그램 발생할 경우 것으로

  for my $database (@database_list) { 
    my $dbh = DBI->connect($database, $user, $password); 
    if ($dbh) { 
     yadda, yadda, yadda 
    } 
} 

내 기억이 맞다 경우는, RaiseError라는 속성이있다 : 당신은 당신이 성공했는지 확인하는 것을 사용하거나 다음 데이터베이스로 이동해야 할 수 있어야한다 실패한 DBI 호출에서. 그러나 기본값을 설정하지 않아야하므로 문제가 발생하지 않아야합니다.

+0

나는 이것을 발사하고 무슨 일이 일어나는지를 보게 될 것이다. – squiguy

관련 문제