sql >> Databasteknik >  >> RDS >> Mysql

MySQL lagrad procedur orsakade `Kommandon ur synk`

Det verkar finnas en otäck bugg (eller funktion) som visar sig när en lagrad procedur anropas som returerar en resultatuppsättning. . d.v.s. en lagrad procedur som slutar med en select-sats utan INTO-sats (se exempel nedan).

Mysqli-drivrutinen (förmodligen) returnerar 2 resultatuppsättningar. Den första är den som returneras från den lagrade proceduren och den andra en dummy, tom resultatuppsättning. Det är som att ett kommando för flera frågor utfärdades. En lösning på detta (som inte går sönder på vanliga (t.ex. SELECT) frågor), är att konsumera denna dummy-resultatuppsättning efter att ha bearbetat den legitima (den första).

Exempel php-kod

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

Exempel på lagrad procedur:

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. Hur ställer man in teckenuppsättning för MySQL i RODBC?

  2. Postgres - Transponera rader till kolumner

  3. TIME() Exempel – MySQL

  4. Hur man kontrollerar konfigurationsinställningarna för Databas Mail i SQL Server (T-SQL)