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

MySQL-lagret procedure forårsagede 'Kommandoer ude af synkronisering'

Der ser ud til at være en grim fejl (eller funktion), der manifesteres, når du kalder en lagret procedure, der returnerer et resultatsæt. . dvs. en lagret procedure, der slutter med en select-sætning uden en INTO-sætning (se eksempel nedenfor).

Mysqli-driveren returnerer (formentlig) 2 resultatsæt. Den første er den, der returneres fra den lagrede procedure, og den anden er et dummy, tomt resultatsæt. Det er som om en kommando med flere forespørgsler blev udstedt. En løsning på dette (som ikke går i stykker ved sædvanlige (f.eks. SELECT) forespørgsler), er at forbruge dette dummy-resultatsæt efter at have behandlet det legitime (det første).

Eksempel php-kode

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";
  }
}

Eksempel på lagret procedure:

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;


  1. Hvad er det modsatte af GROUP_CONCAT i MySQL?

  2. MySQL vælg rækker fra præcis 7 dage siden

  3. Fejlretning af private procedurer

  4. Drop database return Fejl ved droppe database fejlnr.:66 i MySQL