(Atualizando para uma resposta )
Parece este bug , que ainda está aberto depois de quase cinco anos; tente em vez disso:
while (true) {
try {
$row = $qry_bat->fetch(PDO::FETCH_ASSOC);
if (!$row) break;
$ins_db->execute(array(...));
$newOnes++;
}
catch (PDOException $e) {
if ($e->getCode() != 23000) {
echo '<span class="msg-alert">'.$e->getMessage().'</span>';
} else {
$doublons++;
}
}
}