C'est un peu une mauvaise fonctionnalité de PDO qui n'est pas bien documentée. La méthode closeCursor ne fonctionne pas lorsque l'instruction a exécuté une procédure stockée. Vous devez utiliser la méthode nextRowSet. Voici ce que j'utilise
while($sth->nextRowSet())
{
$sth->fetchAll();
}
$sth->closeCursor();