在Perl中,如何检查从DBI查询返回了多条记录?

3
我已经在网站上搜索过了,但没有找到任何回答我的问题的内容。以下是详细信息:
我正在使用简单的 select 查询查询数据库,实际上(根据情况)它不应该返回超过 5 到 6 条记录。我只想检查是否返回了多个记录。如果返回了多个记录,则在 else 语句中执行相应操作;如果只返回了一个记录,则继续运行脚本。
代码如下:
my $sql = qq { SELECT col1, col2, col3 FROM table WHERE col1 = 'foo' };
my $sth = $dbc->prepare_cached($sql) or die "Could not prepare statement: " . $dbc->errstr; $sth->execute() or die "Could not execute statement: " . $sth->errstr;
# 不确定如何高效地检查是否返回了多行,并且仍然可以继续进行。这就是我的问题!我在考虑嵌套 if 语句来检查是否返回了任何行,然后继续检查一行或多行?但是如何检查这个呢(像 count 函数一样)? if (my $ref = $sth->fetchrow_hashref()) {
# 返回了一行...
} else { # 返回了多行... 糟糕! }
如果您知道我找不到的解答此问题的帖子,请指引我去看看。谢谢!
问候, BorisTheBulletDodger!

当返回多行时,您将在else中执行什么工作? - mleykamp
我将记录一个错误,指出此查询存在重复行。 - BorisTheBulletDodger
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";

1
谢谢你提供这个Chas,不过我有一个快速问题!如果没有返回任何行,会发生什么?如果没有返回任何行,我正在尝试记录一种特定的错误,另一种(不同的)错误如果返回了超过一行,则只有返回了一个行才继续进行脚本。这只是处理第二行的情况!(不过...这是一个非常好的解决方案)。谢谢 - BorisTheBulletDodger
1
嗯,指针会因为“太多行”而死掉,让我来修复一下。 - Chas. Owens
我在实际计算行数时遇到了问题。$rows属性似乎返回一个"ARRAY(0x1ae2a6c)"值。我已经尝试了许多方法来获取值,但都没有成功。谢谢 - BorisTheBulletDodger
解决方案完美运行。 - BorisTheBulletDodger

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";
}

这是我最初考虑的路线。我认为这已经足够了! - BorisTheBulletDodger
尝试了这个,但它只是重新选择并将相同的行填充到$second中,就像它对$row所做的一样。目前它不能正常工作。 - BorisTheBulletDodger

4
唯一确定是否通过SELECT找到了多行数据的权威方法是尝试检索多行数据。 DBI确实提供了 -> rows 属性,但仅保证适用于非 SELECT 语句。
虽然不完全相同,但如何检查数据库查询是否会返回结果的答案也可能很有用。

谢谢你提供的链接,戴夫。虽然它很有见地,但这个人似乎只关注获取一些数据或没有数据!而我则专注于获取零个或一个(记录),如果返回多个,则执行“哎呦!”部分!我认为DBI存在一个限制,即在选择语句中不提供计数功能。即使只是部分计数。 - BorisTheBulletDodger

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接