Документацию по использованию брокера сообщений можно найти в репозитории в https://bitbucket.org/shareandcharge/message-broker/src/develop/
и пример реализации будет обнародован 1 апреля 2019 года
Действительно простой путь был бы:
$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";
}
При использовании Mysql метод "строк" работает просто великолепно:
$sth->execute();
if($sth->rows) {
print "We have data!\n";
}
while(my $ref = $sth->fetchrow_hashref()) {
...
}
Метод и некоторые протесты, документируются в обширную деталь в "perldoc DBI". Всегда запускайте с "perldoc".
Это не так вопрос о Perl, как это - вопрос о базе данных, и нет никакого хорошего способа знать, сколько результатов Вы имеете, пока у Вас нет их. У Вас есть два варианта здесь:
Например, первое, что пришло на ум:
my @results = ();
while (my $ref = $sth->fetchrow_hashref()) {
push @results, $ref;
}
if ($#results == 0) {
... no results
} else {
foreach $ref (@results) {
my $temp = $template;
....
}
Так как все хотят оптимизировать далеко повторные тесты для того, был ли заголовок распечатан в решении 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";
}
Немного более эффективный путь (избегающий условного выражения в цикле), если Вы не возражаете против него изменяющий путь страница, производится немного (внезапно, а не строка за один раз), Вы могли сделать переменную для содержания вывода незадолго до цикла:
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;
}
Говорит 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;
}
Просто добавьте другой запрос.. что-то вроде этого:
# 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);
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) {
...
}
}