Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gespeicherte MySQL-Prozedur verursachte `Commands out of sync`

Es scheint einen bösen Fehler (oder eine Funktion) zu geben, der sich manifestiert, wenn eine gespeicherte Prozedur aufgerufen wird, die eine Ergebnismenge zurückgibt. . D.h. eine gespeicherte Prozedur, die mit einer select-Anweisung ohne INTO-Klausel endet (siehe Beispiel unten).

Der mysqli-Treiber gibt (wahrscheinlich) 2 Ergebnismengen zurück. Der erste ist derjenige, der von der gespeicherten Prozedur zurückgegeben wird, und der zweite eine leere Dummy-Ergebnismenge. Es ist, als ob ein Mehrfachabfragebefehl ausgegeben wurde. Eine Lösung dafür (die bei üblichen Abfragen (z. B. SELECT) nicht bricht) besteht darin, diese Dummy-Ergebnismenge zu konsumieren, nachdem die legitime (die erste) verarbeitet wurde.

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

Beispiel einer gespeicherten Prozedur:

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;