Mysql
 sql >> Database >  >> RDS >> Mysql

La procedura memorizzata MySQL ha causato "Comandi non sincronizzati".

Sembra esserci un brutto bug (o funzionalità) che si manifesta quando si chiama una stored procedure che restituisce un set di risultati. . Cioè. una procedura memorizzata che termina con un'istruzione select senza una clausola INTO (vedi esempio di seguito).

Il driver mysqli (probabilmente) restituisce 2 set di risultati. Il primo è quello restituito dalla procedura memorizzata e il secondo un set di risultati fittizio e vuoto. È come se fosse stato emesso un comando di query multiple. Una soluzione a questo (che non si interrompe con le solite query (ad es. SELECT)) è consumare questo set di risultati fittizi dopo aver elaborato quello legittimo (il primo).

Esempio di codice 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";
  }
}

Esempio di procedura memorizzata:

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;