我如何获得受影响的行数,当我使用DBI准备/执行非SELECT语句?

问题描述 投票:4回答:3

按照DBI文档,看来我只能通过do方法获得受影响的行数。

$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");

我怎样才能得到同样的结果,如果我用prepare / execute

perl dbi
3个回答
8
投票

大约从execute method in DBI的文档:

对于非“SELECT”语句,“执行”返回受影响,如果知道的行数。如果没有行受到影响,然后“执行”返回“0E0”,这Perl会当作0,但将视为真。请注意,这是不是一个错误的任何行通过声明的影响。如果不知道受影响的行数,则“执行”返回-1。


5
投票

如果您的查询是一个非选择一个(例如UPDATE或DELETE),那么你可以利用rows的:

my $query = "...";  # your query
my $sth = $dbh->prepare($query);
$sth->execute();
print "Number of rows affected: " . $sth->rows . "\n";

行返回受上一查询或-1错误的情况下的行数。然而,在设计上,你可以不依赖于行的SELECT语句。

需要注意的是,对于非SELECT查询,也execute返回受影响的行数。然而,如果没有行受到影响,那么execute返回“0E0”(其中的Perl无论如何都应该当作0)。

my $query = "...";  # your query
my $sth = $dbh->prepare($query);
my $numrows = $sth->execute();
print "Number of rows affected: " . $numrows . "\n";

相反,如果你的查询是一个SELECT,那么你可以不依赖于行。

但是,您可以执行:

my $query = "SELECT COUNT(*) AS rows FROM ... WHERE ...";
my $numrows = $dbh->selectrow_array($query, undef);
print "Number of rows: " . $numrows . "\n";

或者,类似的:

my $query = "SELECT COUNT(*) AS rows FROM ... WHERE ...";
my $numrows = $dbh->selectall_arrayref($query, { Slice => {} });
print "Number of rows: " . @$numrows[0]->{rows} . "\n";

0
投票

作为user153275说:

“这似乎不正确下去,至少在4.007版本。 执行将返回匹配的行,受影响的行不数数“。

我发现这个链接有用的解决方案,将在where子句AND (columnName <> newValue)https://www.perlmonks.org/?node_id=1141381

这样,查询就会发现只有改变行。

© www.soinside.com 2019 - 2024. All rights reserved.