Как я могу проверить, возвратит ли запрос базы данных результаты?

Документацию по использованию брокера сообщений можно найти в репозитории в https://bitbucket.org/shareandcharge/message-broker/src/develop/

и пример реализации будет обнародован 1 апреля 2019 года

5
задан brian d foy 14 November 2008 в 20:32
поделиться

8 ответов

Действительно простой путь был бы:

$sth->execute();

my $first = 1;
while (my $ref = $sth->fetchrow_hashref()) {
    if( $first ) {
        print "We currently have the following vacancies:\n";
        $first = 0;
    }
    my $temp  = $template;
    ...
}
if( $first ) {
    print "No vacancies found\n";
}
15
ответ дан 18 December 2019 в 06:13
поделиться

При использовании Mysql метод "строк" работает просто великолепно:

$sth->execute();

if($sth->rows) {
  print "We have data!\n";
}

while(my $ref = $sth->fetchrow_hashref()) {
...
}

Метод и некоторые протесты, документируются в обширную деталь в "perldoc DBI". Всегда запускайте с "perldoc".

3
ответ дан 18 December 2019 в 06:13
поделиться

Это не так вопрос о Perl, как это - вопрос о базе данных, и нет никакого хорошего способа знать, сколько результатов Вы имеете, пока у Вас нет их. У Вас есть два варианта здесь:

  1. Сделайте запрос, который проводит "избранный подсчет (*)" для наблюдения сколько строк, там, и затем другой запрос для получения фактических строк или
  2. Сделайте запрос и сохраните результаты в хеш, затем рассчитайте, сколько записей Вы имеете в хеше, и затем проходите хеш и распечатываете результаты.

Например, первое, что пришло на ум:

my @results = ();
while (my $ref = $sth->fetchrow_hashref()) {
   push @results, $ref;
}

if ($#results == 0) {
  ... no results
} else {
  foreach $ref (@results) {
    my $temp = $template;
    ....
 }
3
ответ дан 18 December 2019 в 06:13
поделиться

Так как все хотят оптимизировать далеко повторные тесты для того, был ли заголовок распечатан в решении Graeme, я представляю эту незначительную вариацию на него:

$sth->execute();

my $ref = $sth->fetchrow_hashref();
if ($ref) {
  print "We currently have the following vacancies:\n";
  while ($ref) {
    my $temp  = $template;
    ...
    $ref = $sth->fetchrow_hashref();
  }
} else {
    print "No vacancies found\n";
}
2
ответ дан 18 December 2019 в 06:13
поделиться

Немного более эффективный путь (избегающий условного выражения в цикле), если Вы не возражаете против него изменяющий путь страница, производится немного (внезапно, а не строка за один раз), Вы могли сделать переменную для содержания вывода незадолго до цикла:

my $output = '';

и затем в цикле, измените любой оператор печати для сходства с этим:

$output .= "whatever we would have printed";

затем после цикла:

if ($output eq '')
{
  print 'We have no vacancies.';
}
else
{
  print "We currently have the following vacancies:\n" . $output;
}
1
ответ дан 18 December 2019 в 06:13
поделиться

Говорит perldoc DBI:

 For a non-"SELECT" statement, "execute" returns the number of rows
 affected, if known. If no rows were affected, then "execute"
 returns "0E0", which Perl will treat as 0 but will regard as true.

Таким образом, ответ должен проверить, что возвращаемое значение $sth-> выполняется ():

 my $returnval = $sth->execute;
 if (defined $returnval && $returnval == 0) {
     carp "Query executed successfully but returned nothing";
     return;
 }
-2
ответ дан 18 December 2019 в 06:13
поделиться

Просто добавьте другой запрос.. что-то вроде этого:

# count the vacancies    
$numinfo = $dbh->prepare("SELECT COUNT(*) FROM $table WHERE EXPIRY >= ?");
$numinfo->execute($date);
$count = $numinfo->fetchrow_arrayref()->[0];

# print a message
my $msg = '';
if   ($count == 0) $msg = 'We do not have any vacancies right now';
else               $msg = 'We have the following vacancies';
print($msg);
1
ответ дан 18 December 2019 в 06:13
поделиться
use Lingua::EN::Inflect 'PL';

$sth->execute();
my $results = $sth->fetchall_arrayref( {}, $max_rows );

if (@$results) {
    print "We currently have the following ", PL("vacancy",scalar @$results), ":\n";

    for my $ref (@$results) {
        ...
    }
}
1
ответ дан 18 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

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