sql >> Database >  >> RDS >> Mysql

MySQL-opgeslagen procedure veroorzaakte `Opdrachten niet gesynchroniseerd`

Er lijkt een vervelende bug (of functie) te zijn die zich manifesteert bij het aanroepen van een opgeslagen procedure die een resultatenset retourneert. . D.w.z. een opgeslagen procedure die eindigt met een select-statement zonder een INTO-clausule (zie onderstaand voorbeeld).

De mysqli-driver retourneert (waarschijnlijk) 2 resultatensets. De eerste is degene die is geretourneerd uit de opgeslagen procedure en de tweede een dummy, lege resultatenset. Het is alsof er een opdracht voor meerdere zoekopdrachten is gegeven. Een oplossing hiervoor (die niet kapot gaat bij gebruikelijke (bijv. SELECT) query's), is om deze dummy-resultatenset te gebruiken nadat de legitieme (de eerste) is verwerkt.

Voorbeeld php-code

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

Voorbeeld opgeslagen 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. Hoe kan ik een transactie-impasse opheffen?

  2. Hoe snel is ODBC precies? Een "geladen" vergelijking.

  3. Trigger om invoeging te voorkomen voor dubbele gegevens van twee kolommen

  4. Afstemmen van SQL-statements in SQL Developer