Saltar al contenido

consulta dinámica mysql en procedimiento almacenado

No olvides que en la informática un error puede tener más de una soluciones, por lo tanto nosotros te compartiremos lo más óptimo y eficiente.

Solución:

Código de error: 1054. Columna desconocida ‘SPA’ en ‘cláusula where’

Esto sucede cuando no incluye la entrada string entre comillas, y el motor SQL intenta identificarlo como una columna en la tabla que se consulta. Pero falla porque no puede encontrarlo.

Pero, ¿qué sucede cuando encuentra dicha columna?
Obtiene resultados cuando encuentra algunas coincidencias en los valores de la columna.
Obviamente esto no es lo que uno esperaba.

¿Cómo superar esto? Use declaraciones preparadas con valores de entrada dinámicos.

Puede usar marcadores de posición como ? en procedimientos almacenados también en valores de entrada dinámicos para usar con Prepared Statements. El motor manejará caracteres de escape y otros string valores cuando se asignan o comparan dentro de expresiones SQL.

Solo necesita reasignar las entradas del procedimiento a una o más variables de sesión, según sea necesario.

Ejemplo de su procedimiento:

CREATE PROCEDURE `test1`( IN tab_name VARCHAR(40), IN w_team VARCHAR(40) )
BEGIN
  SET @t1 = CONCAT( 'SELECT * FROM ', tab_name, ' where team = ?' ); -- <-- placeholder
  SET @w_team := w_team;

  PREPARE stmt3 FROM @t1;
  EXECUTE stmt3 USING @w_team; -- <-- input for placeholder
  DEALLOCATE PREPARE stmt3;
END;

Te perdiste las citas en WHERE cláusula.

Prueba así:

SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");

Explicación:

Consulta de su código sería como:

SELECT * FROM Test where team=SPA

Y lo cambiamos a:

SELECT * FROM Test where team='SPA'

Prueba esto..

CREATE PROCEDURE `test1`(IN tab_name VARCHAR(40),IN w_team VARCHAR(40))
BEGIN
SET @t1 =CONCAT("SELECT * FROM ",tab_name," where team='",w_team,"'");
 PREPARE stmt3 FROM @t1;
 EXECUTE stmt3;
 DEALLOCATE PREPARE stmt3;
END

Te faltan citas alrededor w_team variable..

debe imprimir la declaración que se crea dinámicamente para que pueda simplemente copiar la declaración impresa e intentar encontrar fácilmente este tipo de problema.

select @t1 imprimirá la declaración que se construye dinámicamente.

Al final de todo puedes encontrar las notas de otros creadores, tú incluso tienes la libertad de mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *