Просто чтобы уточнить, что вызов метода finish () означает, что вы просто завершили текущий запрос и его результаты, и теперь вы можете безопасно снова вызвать execute (). Нет необходимости сначала вызывать prepare ().
Я поймал это в AIX, используя драйвер ODBC для базы данных DB2 SQL. Я думаю, что это была AIX, у которой был старый драйвер ODBC, возможно, потому что в Linux все было хорошо.
Во всяком случае, я выполнил запрос SQL, который снова и снова возвращает одну строку в цикле for, и получил ошибку 24000.
my $sth = $dbh->prepare( $query ) or die "dying";
foreach my $i (@blah)
{
$sth->execute($fred, $i) or die "dying";
my $hash_ref = $sth->fetchrow_hashref("NAME_uc"); # only a single row exists
...
$sth->finish(); # MUST do this
}
Мой вывод заключается в том, что мне пришлось вызвать $ sth-> finish (), чтобы я мог снова безопасно вызвать $ sth-> execute (), в противном случае я мог бы получить сообщение об ошибке «Недопустимое состояние курсора. SQLSTATE = 24000».
Это потому, что мы должны убедиться, что полностью прочитали или извлекли весь набор данных, прежде чем перейти к следующему оператору. $ Sth-> finish () указывает DBI, что вы закончили с
дескриптор Затем его можно повторно использовать для вызова execute ()
Я также обнаружил, что вместо этого я могу поместить выборку в цикл while, хотя когда-либо возвращается только одна строка, кроме запроса. Кажется, что попытка извлечь следующую несуществующую строку также делает sth пригодным для выполнения.
my $sth = $dbh->prepare( $query ) or die "dying";
for
{
$sth->execute($fred, $i) or die "dying";
while (my $hash_ref = $sth->fetchrow_hashref("NAME_uc"))
{
...
}
}
Оба решения работали для меня. :)