Questa è una caratteristica un po' scarsa di PDO che non è ben documentata. Il metodo closeCursor non funziona quando l'istruzione ha eseguito una stored procedure. Devi usare il metodo nextRowSet. Ecco cosa uso
while($sth->nextRowSet())
{
$sth->fetchAll();
}
$sth->closeCursor();