Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

O procedimento armazenado do MySQL causou 'Comandos fora de sincronia'


Parece haver um bug desagradável (ou recurso) que se manifesta ao chamar um procedimento armazenado que retorna um conjunto de resultados. . Ou seja um procedimento armazenado que termina com uma instrução select sem uma cláusula INTO (veja o exemplo abaixo).

O driver mysqli (provavelmente) retorna 2 conjuntos de resultados. O primeiro sendo aquele retornado do procedimento armazenado e o segundo um conjunto de resultados fictício e vazio. É como se um comando de consulta múltipla fosse emitido. Uma solução para isso (que não quebra nas consultas usuais (por exemplo, SELECT)) é consumir esse conjunto de resultados fictício após processar o legítimo (o primeiro).

Exemplo de código php
function do_query($con, $sql)
{
  if ( !($result = mysqli_query($con, $sql)) )
    throw new QueryException(mysqli_error($con));
  if ($result === true)
     return true;
  while ($row = mysqli_fetch_assoc( $result )) {
    // process rows
  }
  // Hack for procedures returning second dummy result set
  while(mysqli_more_results($con)) {
    mysqli_next_result($con);
    // echo "* DUMMY RS \n";
  }
}

Exemplo de procedimento armazenado:
CREATE PROCEDURE selectStaleHeaders()
NOT DETERMINISTIC
SELECT TT.*
FROM one_pretty_table AS TT
  LEFT JOIN another AS AN on TT.fk_id = AN.id
WHERE TT.id IS NULL;