当我使用 DBI 的 prepare/execute for non-select 语句时,如何获取受影响的行数?



根据DBI文档,似乎我只能通过do方法获得受影响的行数。

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

如果我使用prepare/execute如何得到相同的结果?

来自DBI中execute方法的文档:

对于非"SELECT"语句,"execute"返回行数受影响,如果知道的话。如果没有行受到影响,则返回"execute"0E0", Perl将其视为0,但将其视为真。请注意,它是如果语句不影响任何行,则不存在错误。如果受影响的行数未知,则"execute"返回-1。

如果您的查询是非select 查询(例如UPDATE或DELETE),那么您可以利用rows:

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

rows返回上次查询影响的行数,如果出现错误,则返回-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";

, user153275 说:

"这似乎不再是正确的,至少在4.007版本。
Execute返回匹配的行数,而不是受影响的行数。"

我在这个链接中找到了一个有用的解决方案,添加where子句AND (columnName <> newValue):
https://www.perlmonks.org/?node_id=1141381

这样,查询将只找到要更改的行。

最新更新