Esta é uma característica um pouco pobre do PDO que não está bem documentada. O método closeCursor não funciona quando a instrução executou um procedimento armazenado. Você precisa usar o método nextRowSet. Aqui está o que eu uso
while($sth->nextRowSet())
{
$sth->fetchAll();
}
$sth->closeCursor();