Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何知道Perl DBI查询返回多少行?_Mysql_Perl_Dbi - Fatal编程技术网

Mysql 如何知道Perl DBI查询返回多少行?

Mysql 如何知道Perl DBI查询返回多少行?,mysql,perl,dbi,Mysql,Perl,Dbi,我试图用Perl对数据库进行基本搜索,以判断是否有具有特定ID的项。此搜索可以不返回任何行,但也可以返回一行 我有以下代码: my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'}); $th->execute(); if ($th->fetch()->[0] != $exid) { ... 基本上,这会尝试查看ID是否已返回,如果未

我试图用Perl对数据库进行基本搜索,以判断是否有具有特定ID的项。此搜索可以不返回任何行,但也可以返回一行

我有以下代码:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0] != $exid) {
        ...
基本上,这会尝试查看ID是否已返回,如果未返回,则继续执行脚本。但是它在
$th->fetch()->[0]
东西上抛出了一个空数组引用错误。 我怎么能简单地检查它是返回行还是现在返回

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
my $found = 0;
while ($th->fetch()) 
{
   $found = 1;
}
如果行不存在,查询将不会返回任何内容,因此您无法取消对提取的引用

更新:您可能希望将其重新写入

my $found = $th->fetch();

更改“选择”以始终返回某些内容?这应该适用于Sybase,不知道其他数据库

my $th = $dbh->prepare(qq{SELECT count(*) FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0]) {
....
}
驱动程序有一个
rows()
方法,可以返回结果计数:

$sth = $dbh->prepare( ... );
$sth->execute;
$rows = $sth->rows;

这是特定于数据库驱动程序的,因此它可能在其他驱动程序中不起作用,或者在其他驱动程序中可能起不同的作用。

一般来说,我不确定人们为什么如此害怕异常。你抓住他们,继续前进

my $sth = prepare ...
$sth->execute;
my $result = eval { $sth->fetchrow_arrayref->[1] };

if($result){ say "OH HAI. YOU HAVE A RESULT." }
else       { say "0 row(s) returned."         }
不过,在这种情况下,保罗的答案是最好的


另外,
$sth->rows
通常在获取每一行之前都不起作用。如果您想知道有多少行匹配,那么您必须向数据库引擎询问您想知道答案的问题;也就是说,
从foo where bar='baz'
中选择count(1)

确定select查询返回多少行的唯一可靠方法是获取所有行并对它们进行计数。如下列文件所述:

一般来说,你只能依靠一排 非选择执行后的计数(对于 一些特定的操作,如更新 和删除),或在获取所有 SELECT语句的行

选择 声明,它通常不是 可能知道将有多少行 除了把它们都拿回来以外,其他的都回来了。 一些司机将返回的号码 应用程序获取的行数如此之多 远,但其他人可能返回-1,直到 所有行都已提取。所以使用 rows方法或$DBI::rows with 不建议使用SELECT语句

然而,当你开始认真思考时,你几乎不需要事先知道这一点。只要在($sth->fetch)过程中循环
即可处理每一行,对于只返回零行或一行的查询的特殊情况

if ($sth->fetch) {
  # do stuff for one row returned
} else {
  # do stuff for no rows returned
}
为什么不直接“选择计数(*)…”

或阻止:

或者,如果您要经常执行此操作:

my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?");
....save $sth (or use prepare_cached()) and then later
my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);

本文可能会向8版之前的MySQL用户介绍:

幸运的是,由于MySQL 4.0.0,您可以在查询中使用SQL\u CALC\u FOUND\u ROWS选项,该选项将告诉MySQL不计LIMIT子句计算总行数。您仍然需要执行第二个查询来检索行计数,但这是一个简单的查询,并不像检索数据的查询那样复杂

用法非常简单。在主查询中,您需要在SELECT之后添加SQL\U CALC\U FOUND\U ROWS选项,在第二个查询中,您需要使用FOUND\U ROWS()函数获取总行数。查询如下所示:

选择SQL\u CALC\u FOUND\u ROWS name,从名称如“a%”限制为10的用户发送电子邮件

选择查找的行()

唯一的限制是您必须在第一个查询之后立即调用第二个查询,因为SQL\u CALC\u FOUND\u ROWS不会将行数保存在任何位置

尽管此解决方案还需要两个查询,但由于只执行一次主查询,因此速度要快得多

您可以阅读MySQL文档中有关SQL\u CALC\u FOUND\u ROWS和FOUND\u ROWS()的更多信息

遗憾的是,截至2017年8月0日:

从MySQL 8.0.17开始,SQL\u CALC\u FOUND\u ROWS查询修饰符和附带的FOUND\u ROWS()函数已被弃用


详细信息。

这与您正在使用的库有更多关系。。。您可以更新您的问题,使其更加具体。@Robert,这与他正在使用的库无关。所有ODBC驱动程序都以相同的方式运行。我希望这只是示例代码。但是您应该使用bind values.DBI有rows()方法,但是rows()在获取所有行之前不会为许多DBD中的SELECT返回有意义的结果。这里我们讨论的是特定的DBD。:)啊,我现在看到了…隐藏在节点的标记中…如果这是问题的一个重要部分,它应该在标题或文本中:-)“…无论如何,你几乎不需要事先知道”-对于非常常见的结果分页,您需要提前知道有多少个结果。我想看看我的程序在选择的记录总数中读取/处理了多少记录。如果我的select抓取了10000条记录,并且它每分钟处理100条记录,那将需要一段时间。
my $q_exid = $dbh->quote($exid);
my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = $q_exid");
my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?");
....save $sth (or use prepare_cached()) and then later
my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);