-1

データベースに接続していて、実行の一部として使用する STDIN から入力を取得しています。ので、私は持っています:

my $i = 0;

while($i != 1) {
    print "Input: ";
    my $input = <STDIN>;
    chomp $input;
    my $test = $dbh->prepare("show tables like $input");

次に、入力がデータベース内の有効なエントリであることを確認し、そうでない場合は再度ループします。

    if ($test->execute()) {
        print "Input exists in database\n";
        $i = 1;
    }
    else {
        print "Input does not exist.\n";
    }
} # end of while

execute or dieこれが機能しないことはわかっていますが、プログラムを終了したくないので、そうではない同様のものが欲しいです。これは可能ですか?

4

2 に答える 2

1

次の 2 つのオプションがあります。

1) データベース ハンドルの RaiseError 属性を無効にします。これは、接続を作成するときに実行できます。

$dbh = DBI->connect($dsn, $user, $password, { RaiseError => 0 });

これにはもちろん、適切な場所で $DBI::err をテストして、自分でエラーを処理する必要があります。

2) エラーをキャッチします。Try/Catch フレームワーク (TryCatch または Try::Tiny をお勧めします) のいずれかを使用するか、手動で eval を使用します。例えば:

if (defined( eval { $test->execute() // 0 } ) {
    print "Success";
} else {
    pring "Bugger, I died...: $DBI:Err";
}
于 2012-09-18T09:03:23.073 に答える
0

私は実際に別の方法で解決策を見つけましたが、答えてくれたpmakholmに感謝します。

my $i = 0;

while($i != 1) {
    print "Input: ";
    my $input = <STDIN>;
    chomp $input;
    my $test = $dbh->prepare("show tables like $input");
    my $var = $test->execute();
    if ($var != 0) {
        print "Input exists in database\n";
        $i = 1;
    }
    else {
        print "Input does not exist.\n";
    }
} # end of while

私が考えていなかったのは、データベースにナンセンスを入力したとしても、そのテーブルが存在するかどうかを確認しようとしているということです-存在しない場合は空のセットを返すだけなので、ゼロかどうかを確認できます(かどうかを確認するNULL方が良いかもしれませんが、これは機能します)。エラーが返されると思っていましたが、そうではありません。pmakholm - クエリが機能することを確認する必要がある場合は、あなたの方法を使用します。

于 2012-09-18T09:22:44.963 に答える