Mysql
 sql >> Base de données >  >> RDS >> Mysql

La procédure stockée MySQL a causé `Commandes désynchronisées`

Il semble y avoir un bogue (ou une fonctionnalité) désagréable qui se manifeste lors de l'appel d'une procédure stockée qui renvoie un jeu de résultats. . C'est à dire. une procédure stockée qui se termine par une instruction select sans clause INTO (voir l'exemple ci-dessous).

Le pilote mysqli renvoie (probablement) 2 jeux de résultats. Le premier étant celui renvoyé par la procédure stockée et le second un jeu de résultats factice et vide. C'est comme si une commande de requête multiple avait été émise. Une solution à cela (qui ne casse pas les requêtes habituelles (par exemple SELECT)), consiste à consommer cet ensemble de résultats factices après avoir traité le légitime (le premier).

Exemple de code 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";
  }
}

Exemple de procédure stockée :

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;