Как проверить, было ли возвращено более одной записи из запроса DBI в Perl? - PullRequest
3 голосов
/ 29 апреля 2009

Я уже искал это на сайте, но не смог найти ничего, что ответило на мой вопрос. Что подводит меня к деталям:

Я запрашиваю базу данных, используя простой запрос выбора, реально (с учетом сценария) он никогда не должен возвращать более 5-6 записей. Я просто хочу проверить, было ли возвращено более одного. И если было возвращено более одного, действуйте в этом (в операторе else), если был возвращен только один, тогда я продолжаю работу со сценарием.


my $sql = qq { SELECT col1, col2, col3
                 FROM table
            WHERE col1 = 'foo'
          };

my $sth = $dbc->prepare_cached($sql) or die "Could not prepare statement: " . $dbc->errstr;

$sth->execute() or die "Could not execute statement: " . $sth->errstr;

# Not sure how to efficiently check for more than one row returned and still progress if true... This is my problem! I'm thinking a nested if to see if any rows were returned, and then progress with the check of one or more rows? But how can this me checked (like a count function?)
if (my $ref = $sth->fetchrow_hashref()) {

 # One row was returned...

} else {
 # More than one row was returned... Uh oh!
}

Если вы, ребята, знаете о ветке, которую я не смог найти, которая отвечает на этот вопрос, просто перенаправьте мою, и я аннулирую эту ветку!

С уважением, BorisTheBulletDodger!

Ответы [ 4 ]

6 голосов
/ 29 апреля 2009
my $sth = $dbh->prepare("SELECT col1, col2, col3 FROM tablename");
$sth->execute();
my $rows = $sth->fetchall_arrayref({});
if (@$rows == 0) {
    die "no rows returned";
} elsif (@$rows > 1) {
    die "too many rows returned";
}
my $row = $rows->[0];
print "col1 is $row->{col1}\n";
5 голосов
/ 29 апреля 2009
my $sth = $dbh->prepare();
$sth->execute();

my $row = $sth->fetchrow_hashref();
my $second = $sth->fetchrow_hashref();

if ($second) {
  print "2+ rows\n";
} elsif ($row) {
  print "1 row\n";
} else {
  print "no rows\n";
}
4 голосов
/ 29 апреля 2009

Единственный способ достоверно определить, было ли найдено более одной строки SELECT, - попытаться получить более одной строки. DBI предоставляет свойство ->rows, но оно гарантированно работает только для операторов, отличных от SELECT.

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

1 голос
/ 29 апреля 2009

Используйте один из методов fetchall_* или selectall_* (см. Документацию DBI ), поскольку у вас будет максимум 5-6. Затем определите, сколько строк вы получили.

...