Подтвердить что ты не робот

Как узнать, сколько строк возвращает запрос DBI Perl?

Я пытаюсь в основном выполнить поиск через базу данных с помощью Perl, чтобы узнать, есть ли элемент с определенным идентификатором. Этот поиск не может возвращать строки, но также может возвращать их.

У меня есть следующий код:

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0] != $exid) {
        ...

В основном, это пытается увидеть, был ли ID возвращен, а если нет, перейдите к script. Но он бросает опорную ошибку Null-массива на объект $th->fetch()->[0]. Как я могу просто проверить, не вернули ли строки или сейчас?

4b9b3361

Ответ 1

my $th = $dbh->prepare(qq{SELECT bi_exim_id FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
my $found = 0;
while ($th->fetch()) 
{
   $found = 1;
}

Ваш запрос ничего не вернет, если строка не существует, поэтому вы не можете отменить выборку.

Обновить: вам может потребоваться перезаписать это как

my $found = $th->fetch();

Ответ 2

Драйвер DBD:: mysql имеет метод rows(), который может возвращать счетчик результатов:

$sth = $dbh->prepare( ... );
$sth->execute;
$rows = $sth->rows;

Это специфичный для базы данных драйвер, поэтому он может не работать в других драйверах, иначе он может работать по-другому в других драйверах.

Ответ 3

Почему бы вам просто не "выбрать счетчик (*)..."??

my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = '$exid'");

Или помешать Маленькие таблицы Bobby:

my $q_exid = $dbh->quote($exid);
my ($got_id) = $dbh->selectrow_array("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = $q_exid");

Или если вы собираетесь выполнить это много:

my $sth = $dbh->prepare("SELECT count(*) from FROM bounce_info WHERE bi_exim_id = ?");
....save $sth (or use prepare_cached()) and then later
my ($got_id) = $dbh->selectrow_array($sth, undef, $exid);

Ответ 4

Измените выбор, чтобы всегда что-то возвращать? Это должно работать в Sybase, dunno о других БД.

my $th = $dbh->prepare(qq{SELECT count(*) FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0]) {
....
}

Ответ 5

В общем, я не уверен, почему люди так боятся исключений. Вы их поймаете и двигаетесь дальше.

my $sth = prepare ...
$sth->execute;
my $result = eval { $sth->fetchrow_arrayref->[1] };

if($result){ say "OH HAI. YOU HAVE A RESULT." }
else       { say "0 row(s) returned."         }

В этом случае, однако, Павел лучше всего подходит.

Кроме того, $sth->rows обычно не работает, пока вы не выберете каждую строку. Если вы хотите узнать, сколько строк соответствует, тогда вы должны спросить у механизма базы данных вопрос, на который вы хотите знать ответ; а именно select count(1) from foo where bar='baz'.

Ответ 6

Единственный надежный способ узнать, сколько строк возвращает запрос SELECT, - это их выбор и подсчет. Как указано в документации DBI:

Как правило, вы можете полагаться только на строку подсчет после выполнения не-SELECT (для некоторые конкретные операции, такие как UPDATE и DELETE), или после получения всех строки инструкции SELECT.

Для SELECT заявления, как правило, не можно узнать, сколько строк будет возвращаются, кроме как выбирая их всех. Некоторые драйверы вернут количество строк, которые приложение выбрало так далеко, но другие могут возвращать -1 до все строки были извлечены. Поэтому использование метод rows или $DBI:: rows с Операторы SELECT не рекомендуются.

Однако, когда вы приступаете к нему, вы почти никогда не должны знать это заранее. Просто выполните цикл while ($sth->fetch) для обработки каждой строки или, для специального случая запроса, который будет возвращать только ноль или одну строку,

if ($sth->fetch) {
  # do stuff for one row returned
} else {
  # do stuff for no rows returned
}

Ответ 7

Эта статья может помочь пользователям MySQL:

http://www.arraystudio.com/as-workshop/mysql-get-total-number-of-rows-when-using-limit.html

К счастью, с MySQL 4.0.0 вы можете использовать параметр SQL_CALC_FOUND_ROWS в своем запросе, который подскажет MySQL подсчитать общее количество строк без учета предложения LIMIT. Вам все равно нужно выполнить второй запрос, чтобы получить количество строк, но это простой запрос и не такой сложный, как ваш запрос, который извлекал данные.

Использование довольно простое. В главном запросе вам нужно добавить параметр SQL_CALC_FOUND_ROWS сразу после SELECT, а во втором запросе вам нужно использовать функцию FOUND_ROWS(), чтобы получить общее количество строк. Запросы будут выглядеть так:

SELECT SQL_CALC_FOUND_ROWS name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

SELECT FOUND_ROWS();

Единственное ограничение заключается в том, что вы должны вызывать второй запрос сразу после первого, потому что SQL_CALC_FOUND_ROWS не сохраняет число строк в любом месте.

Хотя это решение также требует двух запросов, это намного быстрее, так как вы выполняете основной запрос только один раз.

Вы можете больше узнать о SQL_CALC_FOUND_ROWS и FOUND_ROWS() в документах MySQL.