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

new*_*erl 5 perl dbi

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

$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
Run Code Online (Sandbox Code Playgroud)

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

e.d*_*dan 8

executeDBI中有关方法的文档:

对于非"SELECT"语句,"execute"返回受影响的行数(如果已知).如果没有行受影响,则"execute"返回"0E0",Perl将其视为0但将视为true.请注意,没有行受语句影响不是错误.如果受影响的行数未知,则"execute"返回-1.


Pao*_*lli 5

如果您的查询是非SELECT查询(例如UPDATE或DELETE),则可以利用rows

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

rows返回上一个查询影响的行数;如果出错,则返回-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";
Run Code Online (Sandbox Code Playgroud)

相反,如果您的查询是SELECT,则您不能依赖

但是,您可以执行以下任一操作:

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

或者,类似地:

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