Как получить количество затронутых строк, когда я использую подготовку / выполнение DBI для оператора без выбора? - PullRequest
4 голосов
/ 03 августа 2011

Согласно документации DBI , я могу получить число затронутых строк только методом do.

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

Как получить тот же результат, еслиЯ использую prepare / execute?

Ответы [ 3 ]

7 голосов
/ 03 августа 2011

Из документации о методе execute в DBI :

Для оператора, отличного от «SELECT», «execute» возвращает количество затронутых строк, еслиизвестен.Если никакие строки не были затронуты, то «execute» возвращает «0E0», который Perl будет обрабатывать как 0, но будет считать истиной.Обратите внимание, что это не ошибка, если оператор не влияет на строки.Если число затронутых строк неизвестно, тогда «execute» возвращает -1.

4 голосов
/ 05 сентября 2014

Если ваш запрос не-SELECT (например, ОБНОВЛЕНИЕ или УДАЛЕНИЕ), тогда вы можете воспользоваться строками :

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

строк возвращает количество строк, затронутых последним запросом или -1 в случае ошибки.Тем не менее, по замыслу, вы не можете полагаться на строки для оператора 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 , то вы не можете полагаться на строк .

Однако вы можете сделать либо:

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";
0 голосов
/ 07 февраля 2019

Как user153275 сказал:

"Кажется, это больше не правильно, по крайней мере, в версии 4.007.
Execute возвращает количество совпавших строк, а не количество затронутых строк. "

Я нашел полезное решение по этой ссылке, добавив предложение where AND (columnName <> newValue):
https://www.perlmonks.org/?node_id=1141381

Таким образом, запрос найдет только строки для изменения.

...