根據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語句的行數。所以在你的例子中它應該這樣做。你試過了嗎?結果是什麼? –