Как мне проверить, было ли возвращено более одной записи из запроса DBI в Perl?

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

Я запрашиваю базу данных, используя простой запрос выбора, реально (с учетом сценария) он никогда не должен возвращать более 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!


person Community    schedule 29.04.2009    source источник
comment
Какую работу вы будете выполнять в else, когда будет возвращено более одной строки?   -  person mleykamp    schedule 30.04.2009
comment
Я запишу ошибку, указав, что для этого запроса существуют повторяющиеся строки.   -  person    schedule 30.04.2009


Ответы (4)


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

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

person Dave Sherohman    schedule 29.04.2009
comment
Спасибо за ссылку, Дэйв. Каким бы проницательным это ни было, этот парень, похоже, сосредоточился на получении каких-то данных или ни одного! в то время как я сосредотачиваюсь на том, чтобы не получить данные или одну (запись), если возвращается более одной, выполните команду «Ой ой!» раздел! Я действительно думаю, что в DBI есть ограничение, которое не обеспечивает функцию подсчета на отдельных государственных деятелях. Даже если это частичный подсчет. - person ; 29.04.2009

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

person Jonathan Leffler    schedule 29.04.2009

person    schedule
comment
Спасибо за это, Час, быстрый вопрос! Что произойдет, если не будет возвращено ни одной строки? Я пытаюсь зарегистрировать одну конкретную ошибку, если не было возвращено ни одной строки, другую (другую) ошибку, если было возвращено более одной строки, или просто продолжайте выполнение сценария, поскольку была возвращена только одна строка. Это просто обрабатывает, если есть вторая строка! (Тем не менее ... это очень хорошее решение) Спасибо - person ; 30.04.2009
comment
Хм, точка, он умрет со слишком большим количеством строк, позвольте мне это исправить. - person Chas. Owens; 30.04.2009
comment
У меня проблема с подсчетом строк здесь. Свойство $ rows, похоже, возвращает значение ARRAY (0x1ae2a6c). Я пробовал множество методов для получения значения, но ни один из них не оказался успешным. Спасибо - person ; 01.05.2009
comment
Игнорируйте приведенный выше комментарий. Я ошибся! Решения работают идеально. - person ; 01.05.2009

person    schedule
comment
Это был маршрут, о котором я думал изначально. Думаю, этого достаточно! - person ; 29.04.2009
comment
Пробовал это, это просто повторно выбирает и заполняет ту же строку в $ second, что и в $ row. В настоящее время это не работает. - person ; 30.04.2009