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

7
根据DBI文档的说明,似乎只能通过do方法获取受影响行数。
$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");

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

执行通常会返回非SELECT语句所影响的行数。因此在您的示例中,它应该可以运行。您试过了吗?结果是什么? - matthias krull
3个回答

8

你如何知道语句是否在第一时间存在语法错误? - R__
@R__: prepare 返回 undef。DBI 文档对此确实没有详细说明,但它们给出了示例 $sth = $dbh->prepare($statement) or die $dbh->errstr;,这暗示了这一点。 - e.dan
这似乎不再正确,至少在版本4.007中。execute返回的是匹配行数,而不是受影响行数。 - user153275

7

如果您的查询是非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语句,不能依赖于rows

需要注意的是,对于非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,那么你不能依赖于rows
不过,你可以选择以下两种方式之一:
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";

1

正如user153275所说:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接