3

すでにサイトでこれを検索しましたが、私の質問に答えるものは見つかりませんでした。詳細は次のとおりです。

単純な選択クエリを使用してデータベースにクエリを実行していますが、現実的には (シナリオを考えると) 約 5 ~ 6 レコードを超えることはありません。複数が返されたかどうかを確認したいだけです。複数のリターンがあった場合 (else ステートメントで)、1 つだけが返された場合は、スクリプトを続行します。

my $sql = qq { SELECT col1、col2、col3
                 FROM テーブル
            WHERE col1 = 'フー'
          };

my $sth = $dbc->prepare_cached($sql) または die "ステートメントを準備できませんでした: " . $dbc->errstr;

$sth->execute() または die "ステートメントを実行できませんでした: " . $sth->errstr;

# 返された複数の行を効率的にチェックし、true の場合は進行する方法がわからない... これは私の問題です! 行が返されたかどうかを確認し、1 つ以上の行のチェックを続行するかどうかを確認するために、ネストされた if を考えていますか? しかし、これをどのようにチェックできますか (カウント関数のように?)
if (my $ref = $sth->fetchrow_hashref()) {

 # 1行返された…

} そうしないと {
 # 複数の行が返されました... うーん!
}

私が見つけられなかったスレッドを知っている場合は、この質問に答えてください。リダイレクトしてください。このスレッドを無効にします。

よろしく、BorisTheBulletDodger!

4

4 に答える 4

6
my $sth = $dbh->prepare("SELECT col1, col2, col3 FROM tablename");
$sth->execute();
my $rows = $sth->fetchall_arrayref({});
if (@$rows == 0) {
    die "no rows returned";
} elsif (@$rows > 1) {
    die "too many rows returned";
}
my $row = $rows->[0];
print "col1 is $row->{col1}\n";
于 2009-04-29T14:15:09.420 に答える
5
my $sth = $dbh->prepare();
$sth->execute();

my $row = $sth->fetchrow_hashref();
my $second = $sth->fetchrow_hashref();

if ($second) {
  print "2+ rows\n";
} elsif ($row) {
  print "1 row\n";
} else {
  print "no rows\n";
}
于 2009-04-29T13:06:38.273 に答える
4

によって複数の行が見つかったかどうかを正式に判断する唯一の方法は、複数の行SELECTを取得することです。DBI はプロパティを提供しますが、非ステートメント->rowsに対してのみ機能することが保証されています。SELECT

データベースクエリが結果を返すかどうかを確認するにはどうすればよいですか?への回答 まったく同じ質問ではありませんが、役立つ場合もあります。

于 2009-04-29T12:30:16.940 に答える
1

fetchall_*またはselectall_*メソッドのいずれかを使用してください( DBI のドキュメントを参照)。多くても 5 ~ 6 個しかないためです。次に、最終的に取得した行数を決定します。

于 2009-04-29T12:20:19.430 に答える