【问题标题】:How do I get the number of affected rows when I use DBI's prepare/execute for non-select statement?当我使用 DBI 的 prepare/execute for non-select 语句时,如何获取受影响的行数?
【发布时间】:2011-08-03 07:48:50
【问题描述】:

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

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

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

【问题讨论】:

  • execute 通常返回非 SELECT 语句受影响的行数。所以在你的例子中它应该这样做。你试过了吗?结果如何?

标签: perl dbi


【解决方案1】:

来自关于execute method in DBI的文档:

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

【讨论】:

  • 一开始怎么知道语句有没有语法错误?
  • @R__: prepare 返回 undef。诚然,DBI 文档对此没有明确说明,尽管他们确实给出了示例 $sth = $dbh->prepare($statement) or die $dbh->errstr; 暗示了这一点。
  • 这似乎不再正确,至少在版本 4.007 中。 execute 正在返回 匹配 行的数量,而不是 受影响 行的数量。
【解决方案2】:

如果您的查询是非 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。但是,根据设计,您不能依赖 rows 来执行 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,那么您不能依赖 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";

【讨论】:

    【解决方案3】:

    正如user153275所说:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多