3

我已经在网站上搜索了这个,但找不到任何回答我问题的东西。这让我想到了细节:

我正在使用简单的选择查询来查询数据库,实际上(给定场景)它不应该返回超过大约 5 到 6 条记录。我只是想检查是否已退回多个。如果已经返回了多个(在 else 语句中),如果只返回了一个,那么我会继续执行脚本。

我的 $sql = qq { 选择 col1,col2,col3
                 从表
            在哪里 col1 = 'foo'
          };

我的 $sth = $dbc->prepare_cached($sql) 或 die "Could not prepare statement:" 。$dbc->errstr;

$sth->execute() 或 die "Could not execute statement:" 。$sth->errstr;

# 不知道如何有效地检查返回的多于一行,如果为真,仍然会继续进行......这是我的问题!我在想一个嵌套的 if 来查看是否返回了任何行,然后检查一行或多行?但是我该如何检查(比如计数功能?)
if (我的 $ref = $sth->fetchrow_hashref()) {

 # 返回一行...

} 别的 {
 # 不止一行返回了...呃哦!
}

如果你们知道一个我找不到的线程来回答这个问题,只需重定向我,我就会取消这个线程!

问候,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

唯一能权威地确定 a 是否找到了不止一行的SELECT方法是尝试检索不止一行。DBI 确实提供了该->rows属性,但它只保证对非SELECT语句有效。

如何检查数据库查询是否会返回结果?也可能证明是有用的,即使这不是同一个问题。

于 2009-04-29T12:30:16.940 回答
1

使用其中一种fetchall_*orselectall_*方法(请参阅DBI 文档),因为您最多只有 5-6 个。然后确定你到底得到了多少行。

于 2009-04-29T12:20:19.430 回答