根据DBI文档,似乎我只能通过do
方法获取受影响的行数。当我使用DBI的非选择语句的准备/执行时,如何获取受影响的行数?
$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
我怎样才能得到同样的结果,如果我用prepare
/execute
?
根据DBI文档,似乎我只能通过do
方法获取受影响的行数。当我使用DBI的非选择语句的准备/执行时,如何获取受影响的行数?
$rows_affected = $dbh->do("UPDATE your_table SET foo = foo + 1");
我怎样才能得到同样的结果,如果我用prepare
/execute
?
大约从execute
method in DBI文档:
对于非“SELECT”语句,“执行”返回受影响,如果已知行 数。如果没有行受到影响,那么“执行”返回 “0E0”,Perl会将其视为0,但将视为true。请注意, 它是 对于没有行受语句影响而言不是错误。如果 受影响的行数未知,则“execute”返回-1。
您如何知道语句是否首先出现语法错误? –
@R__:'prepare'返回undef。尽管DBI文档给出了示例'$ sth = $ dbh-> prepare($ statement)或者$ dbh-> errstr;'这个提示,但DBI文档显然比这个明确一点。 –
这似乎不再正确,至少在版本4.007中。 execute将返回*匹配*行数,而不是*受影响*行数。 – 2012-04-10 20:28:36
如果您的查询是非选择之一(例如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应该被视为)。
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";
执行通常返回受影响的非SELECT语句的行数。所以在你的例子中它应该这样做。你试过了吗?结果是什么? –