sql >> Databáze >  >> RDS >> Mysql

Uložená procedura MySQL způsobila `Příkazy se nesynchronizují`

Zdá se, že existuje ošklivá chyba (nebo funkce), která se projevuje při volání uložené procedury, která vrací sadu výsledků. . Tj. uložená procedura, která končí příkazem select bez klauzule INTO (viz příklad níže).

Ovladač mysqli (pravděpodobně) vrací 2 sady výsledků. První je ten, který se vrátil z uložené procedury, a druhý fiktivní, prázdná sada výsledků. Je to, jako by byl vydán příkaz s více dotazy. Jedním z řešení (které se při obvyklých dotazech (např. SELECT) nezlomí) je spotřebovat tuto fiktivní sadu výsledků po zpracování té legitimní (první).

Příklad php kódu

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

Příklad uložené procedury:

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. Funkce RPAD() v Oracle

  2. Postgres:definovat výchozí hodnotu pro selhání CAST?

  3. Složený primární klíč v django

  4. Co je C# ekvivalent datového typu geografického sql serveru v .net frameworku 4.0?