如何确保查询成功执行

Posted

技术标签:

【中文标题】如何确保查询成功执行【英文标题】:How to make sure a query executed successfully 【发布时间】:2013-03-21 07:14:15 【问题描述】:

我需要执行一个 select 语句查询并捕获返回的结果并将其存储在一个变量中。

执行没有返回任何数据。我检查了我的连接是否正确,因为它没有返回任何错误。

$dbh = DBI->connect($data_source, $username, $password) 或者死掉 $DBI::errstr;

以下是我的查询

my $sth = $dbh->prepare('select abc from pqr');
$sth->execute();

现在我正在检查它是否有一些数据

if($sth->rows) 
    print "We have data!\n";
 else 
    print"No Data";

它总是打印No Data

为了获取我正在使用的数据

while(my @data = $sth->fetchrow_array()) 
    print "$data[1]\n";

$dbh->disconnect;

我没有得到任何数据。 谁能建议我这里有什么问题? 使用 Java 时,相同的查询给了我想要的结果。

【问题讨论】:

我会检查execute 的返回值。 $sth->execute() or die "check dbi error msg" @chrsblck 我已经添加了 die 语句,但我没有收到消息“检查 dbi 错误消息”,这意味着查询已成功执行。那么为什么我没有得到想要的结果。我得到的是空数组。 【参考方案1】:

根据 DBI docs

$rv = $sth->行数;

返回受最后一个影响行的命令影响的行数, 如果行数未知或不可用,则为 -1。

通常,您只能在非 SELECT 执行后依赖行数 (对于某些特定的操作,如 UPDATE 和 DELETE),或之后 获取 SELECT 语句的所有行。

写你的:

while(my @data = $sth->fetchrow_array()) 
    print "$data[1]\n";

要求该行的第二个 ([1]) 元素对您的查询没有意义。

【讨论】:

非常感谢。现在我得到了结果。这是我的愚蠢错误。我从过去的2个小时开始战斗。我使用了 $data[0] 并得到了结果。非常感谢。【参考方案2】:

如果您不处理大型结果集,那么获取所有内容会更快

my $rows = $db->selectall_arrayref(qq|Select abc from def|) or die "Can't select " . $db->errstr();
if (@$rows) 
    print "I have rows";
    foreach my $row (@$rows) 
        # do something with $row->[0]
    
 else 
    print "I did not get any rows/data";

只是另一种方式

【讨论】:

以上是关于如何确保查询成功执行的主要内容,如果未能解决你的问题,请参考以下文章

postgresql函数-获取受更新查询影响的行数[重复]

如何一次执行四个查询然后检查成功或失败?

如何动态开启mysql的慢查询日志记录

如何在猫鼬中执行“每个”查询

检查查询是不是通过python成功运行

如何使用 Laravel 框架执行 MySQL 查询?