如何检查 Perl 中的 DBI 查询是不是返回了多个记录?
Posted
技术标签:
【中文标题】如何检查 Perl 中的 DBI 查询是不是返回了多个记录?【英文标题】:How do I check if more than one record has been returned from DBI query in Perl?如何检查 Perl 中的 DBI 查询是否返回了多个记录? 【发布时间】:2010-10-22 13:31:37 【问题描述】:我已经在网站上搜索过此内容,但找不到任何可以回答我问题的内容。这让我想到了细节:
我正在使用简单的选择查询来查询数据库,实际上(给定场景)它不应该返回超过 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!
【问题讨论】:
返回多于一行时,else中会做什么工作? 我将记录一个错误,指出此查询存在重复行。 【参考方案1】:使用fetchall_*
或selectall_*
方法之一(请参阅DBI documentation),因为您最多只有5-6 个。然后确定你到底得到了多少行。
【讨论】:
【参考方案2】:权威地确定SELECT
是否找到多行的唯一方法是尝试检索多行。 DBI 确实提供了->rows
属性,但它只保证适用于非SELECT
语句。
How can I check if a database query will return results? 的答案也可能很有用,尽管这不是同一个问题。
【讨论】:
感谢 Dave 的链接。尽管很有见地,但这个家伙似乎专注于获取一些数据或没有!而我专注于不获取数据或获取一个(记录),如果返回多个,则执行“呃哦!”部分!我确实认为 DBI 存在一个限制,它不提供对选定语句的计数功能。即使只是部分计数。【参考方案3】: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";
【讨论】:
这是我最初考虑的路线。我觉得这就够了! 试过了,这只是重新选择并将同一行填充到 $second 中,就像它对 $row 所做的那样。这目前不起作用。【参考方案4】: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";
【讨论】:
感谢这个Chas,不过请快速提问!如果没有返回行会发生什么?如果没有返回行,我将尝试记录一个特定错误,如果返回了不止一行,则记录另一个(不同的)错误,或者只是在脚本中进行,因为只返回了一行。如果有第二行,这只是处理! (仍然......这是一个非常好的解决方案)谢谢 嗯,点,它会因“太多行”而死,让我解决这个问题。 我在这里实际计算行数时遇到问题。 $rows 属性似乎返回“ARRAY(0x1ae2a6c)”值。我尝试了许多方法来检索价值,但似乎都没有成功。谢谢 忽略上面的评论。我打错了!解决方案完美。以上是关于如何检查 Perl 中的 DBI 查询是不是返回了多个记录?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Perl DBI 检索 DB2 SQL 存储过程的返回值?
如何打印 Perl 的 DBI 填充占位符后执行的 SQL 查询?