Esta es una característica un poco pobre de PDO que no está bien documentada. El método closeCursor no funciona cuando la declaración ha ejecutado un procedimiento almacenado. Debe usar el método nextRowSet. Esto es lo que uso
while($sth->nextRowSet())
{
$sth->fetchAll();
}
$sth->closeCursor();