当我使用DBI为非选择语句准备/执行时,如何获取受影响的行数?

时间:2011-08-03 07:48:50

标签: perl dbi

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

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

如果我使用prepare / execute

,如何获得相同的结果?

3 个答案:

答案 0 :(得分:7)

有关execute method in DBI的文档:

  

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

答案 1 :(得分:4)

如果您的查询是非SELECT (例如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也会返回受影响的行数。但是,如果没有行受影响,则执行将返回" 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";

答案 2 :(得分:0)

user153275 所说:

  

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

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

通过这种方式,查询将仅找到要更改的行。