Хотя, возможно, причина не в том, что вы получили это предупреждение (как утверждает руководство ), но я столкнулся с тем же предупреждением в несколько других обстоятельствах и хотел предложить его здесь, а не открывать свой вопрос.
Вы можете оказаться в этом сценарии, если выполните запрос для извлечения некоторых строк - но только для того, чтобы узнать, есть ли соответствующие строки или нет. В моих обстоятельствах мы обновим строки, если совпадение найдено, и вставим в противном случае.
Поскольку ничего не сделано с найденными строками, я считаю, что это представляет собой сценарий, в котором следует следовать указаниям предупреждения. Поэтому я вызываю finish()
на моем обработчике выбора, прежде чем отключиться.
Отказ от ответственности : Будучи новичком в DBI, потенциально существует лучший подход. Я бы использовал ->do()
, за исключением , документация указала, что он должен не использоваться при многократном выполнении - также не рекомендуется использовать операторы SELECT
по какой-то причине!
Вот некоторый псевдокод perl, показывающий, на что я приземлился:
$selectHandler = $dbh->prepare($queryString) or die "Cannot prepare: ".$dbh->errstr;
#Loop through a list of keys to check existence {
$selectHandler.execute($uniqueID);
$found = 0;
$found = $selectHandler->fetch();
if (!$found) {
# Do an insert of $uniqueID
} else {
# Do an update of $uniqueID
}
#}
# Having not done anything with the selectHandler's result (when rows were
# found) close it now that the loop is complete
$selectHandler->finish(); # we don't need you any more select handler!
$dbh->disconnect or warn "Disconnection error: $DBI::errstr\n";
Надеюсь, это поможет кому-то еще, и не стесняйтесь исправлять мой подход, если я кого-то вводу в заблуждение.