sql >> Base de Datos >  >> RDS >> Mysql

El procedimiento almacenado de MySQL causó 'Comandos fuera de sincronización'

Parece que hay un error desagradable (o característica) que se manifiesta al llamar a un procedimiento almacenado que devuelve un conjunto de resultados. . Es decir. un procedimiento almacenado que finaliza con una declaración de selección sin una cláusula INTO (vea el ejemplo a continuación).

El controlador mysqli (probablemente) devuelve 2 conjuntos de resultados. El primero es el que devuelve el procedimiento almacenado y el segundo es un conjunto de resultados vacío y ficticio. Es como si se hubiera emitido un comando de consulta múltiple. Una solución a esto (que no falla en las consultas habituales (por ejemplo, SELECCIONAR)), es consumir este conjunto de resultados ficticio después de procesar el legítimo (el primero).

Ejemplo de código php

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

Ejemplo de procedimiento almacenado:

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;