2012-03-07 5 views
0

Perlで複数のデータベースに接続できない場合、どうすれば救済できますか?配列内にデータベース名があり、ループでそれらをトラフする場合は、接続してクエリを実行して切断する必要があります。私は私たちが持っている兄弟サーバーの監視ページにそれを報告するつもりです。明らかに配列内のすべてのものをチェックする必要があるので、スクリプトが接続できなければスクリプトを終了させたくありません。今はDBIモジュールのステートメソッドを使用していますが、正しく動作するかどうかはわかりません。みんなありがとう!perlスクリプトで複数のデータベースに接続する

答えて

1

コードを確認できますか?私も使ってかなり確信している

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

{RAISEERROR => 1}、それは自動的に死ぬことはありません。のように私は、あなたが明示的にそれを指示しない限りDBI->connect()への呼び出しが死んでしまうとは思いません。だから、もしあなたがor die...と呼んでいるのであれば、それをしないでください!

編集:私は、アレイ内のデータベース名を持ち、ループ内でそれらをトラフ行く

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 ;; host = $ host; port = $ port "、$ username、$ password); if($ dbh-> state()) ' 私は基本的に接続を実行していますが、接続されているかどうかを確認するために状態を使用しています。これは私にとってはうまくいかないようです。私が何をしようとしているのか、それとももっと説明する必要があるのか​​を教えてください。ありがとう – squiguy

+1

接続が失敗した場合、 '$ dbh'は未定義で、' $ dbh-> state() '呼び出しは致命的な実行時エラーになります。代わりにif($ dbh && $ dbh-> state())...と言ってください。 – mob

+0

はい、@モブ答えで行ってください。別のテストに分割することもできます。接続できない場合や、ステータスが誤った値を戻している場合は、その旨を伝えることができます。 –

0

Perlで例外処理を調べる必要があります。私はPerlを使用しないので、例外処理の構文が分からず、オンラインでも簡単に見つけることができます。

+0

私はそれをどうやって行うのかよく知っていますが、私は何か例外が見つからず、続行し続けることができません。それらのすべてが終了したようです。あなたの入力をお寄せいただきありがとうございます。 – squiguy

0

、:

投稿@squiguyコードを考えると、私はこのようにそれを行うだろう接続してクエリを実行して接続を切断しようとします。

ループしている場合は、複数のデータベースを開く必要はありません。あなたのループでは、データベースを開き、あなたのものを行い、閉じます。

Perlで複数のデータベースに接続するにはどうしたらいいですか?

私はこれがあなたのループにあると仮定しています。 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

関連する問題