Как я знаю, сколько строк Perl DBI запрашивают возвраты?

19
задан brian d foy 19 September 2018 в 18:49
поделиться

6 ответов

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();
13
ответ дан 30 November 2019 в 02:18
поделиться

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

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

Это - конкретный драйвер базы данных, таким образом, он не мог бы работать в других драйверах, или он мог бы работать по-другому в других драйверах.

33
ответ дан 30 November 2019 в 02:18
поделиться

Выбор изменения, чтобы всегда возвратить что-то? Это должно работать в Sybase, не знайте о другом DBS.

my $th = $dbh->prepare(qq{SELECT count(*) FROM bounce_info WHERE bi_exim_id = '$exid'});
$th->execute();
if ($th->fetch()->[0]) {
....
}
3
ответ дан 30 November 2019 в 02:18
поделиться

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

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
ответ дан 30 November 2019 в 02:18
поделиться

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

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."         }

В этом случае, тем не менее, ответ Paul является лучшим.

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

3
ответ дан 30 November 2019 в 02:18
поделиться

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

Обычно можно только полагаться на количество строки после того, как НЕВЫБОР выполняется (для некоторых определенных операций как ОБНОВЛЕНИЕ, и УДАЛИТЕ), или после выборки всех строк оператора SELECT.

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

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

if ($sth->fetch) {
  # do stuff for one row returned
} else {
  # do stuff for no rows returned
}
1
ответ дан 30 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: