MySQL - Error en un Insert

 
Vista:
sin imagen de perfil
Val: 102
Bronce
Ha disminuido 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por Miguel (60 intervenciones) el 19/06/2018 16:50:55
Tengo este código

1
2
3
4
5
6
7
8
9
10
11
12
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertaCalle`(
	IN `tabla` varchar(15),
	IN `campo1` varchar(50)
)
BEGIN
#  not working with where.
set @sql = concat('Insert from ',tabla, values (campo1));
# ---- not working with where 
prepare stm from @sql;
execute stm;
DEALLOCATE prepare stm;
END

Me da un error diciendo que no reconoce el campo1. Los valores reales se los paso desde una clase de Visual Studio 2017. Puede alguien indicarme porque no lo reconoce.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por leonardo_josue (414 intervenciones) el 19/06/2018 17:18:41
Hola Miguel:

Si entiendo correctamente, lo que quieres hacer es crear una sentencia INSERT dinámicamente... el problema es que no estás usando bien la función CONCAT O_o

por un lado tienes esto:

1
set @sql = concat('Insert from ',tabla, values (campo1));

Sin embargo, la función CONCAT recibe como parámetros solo CADENAS, al inicio es correcto que pongas INSERT FROM entre comillas, pero después estás poniendo VALUES pero esto ya no es una cadena, por lo tanto, marca error.

tu sentencia debería quedar algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> DROP PROCEDURE IF EXISTS InsertaCalle;
Query OK, 0 rows affected (0.02 sec)
 
mysql> DELIMITER $$
mysql> CREATE
    ->     PROCEDURE InsertaCalle(
    -> IN tabla VARCHAR(15),
    -> IN campo1 VARCHAR(50),
    -> OUT sentencia VARCHAR(200))
    ->     BEGIN
    -> SET @SQL = CONCAT('INSERT INTO ', tabla, ' VALUES (', campo1, ')');
    -> SELECT @SQL INTO sentencia;
    ->     END$$
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL InsertaCalle ('tabla', 'campo1,campo2', @salida);
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT @salida;
+------------------------------------------+
| @salida                                  |
+------------------------------------------+
| INSERT INTO tabla VALUES (campo1,campo2) |
+------------------------------------------+
1 row in set (0.00 sec)


en este caso, agregué un parámetro de salida para que veas cómo es que queda formada tu consulta al final. Observa que VALUES ( DEBE DE IR ENTRE COMILLAS, para que sea tomada como una cadena y lo mismo pasa con el paréntesis que cierra.

haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 102
Bronce
Ha disminuido 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por Miguel (60 intervenciones) el 19/06/2018 17:36:58
Hola Leonardo

Mi pregunta es que hay que modificar dentro del CONCAT.

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 102
Bronce
Ha disminuido 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por Miguel (60 intervenciones) el 19/06/2018 17:45:31
Leonardo esto es un Procedimiento Almacenado. Por eso la pregunta de si lo que tengo que modificar dentro del CONCAT sería suficiente para que funcione pues el CALL lo genera automáticamente el Procedimiento.


Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 102
Bronce
Ha disminuido 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por Miguel (60 intervenciones) el 19/06/2018 17:49:08
Esta es la modificación realizada pero da error.

1
2
3
4
5
6
7
8
9
10
11
12
CREATE DEFINER=`root`@`localhost` PROCEDURE `InsertaCalle`(
	IN `tabla` varchar(15),
	IN `campo1` varchar(50)
)
BEGIN
#  not working with where.
set @sql = concat('Insert from ',tabla, 'campo1');
# ---- not working with where 
prepare stm from @sql;
execute stm;
DEALLOCATE prepare stm;
END

Me gustaría que me indicaras la modificación dentro del procedimiento.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por leonardo_josue (414 intervenciones) el 19/06/2018 18:16:12
Hola de nuevo:

En primer lugar, ten un poco de paciencia cuando preguntes algo. Los foristas por lo general no estamos todo el día al respondiendo preguntas, tienes tres entradas con una diferencia de tan solo unos minutos, si estás muy urgido de ayuda, pues pregúntale a SAN GOOGLE, el generalmente tiene la respuesta o de lo contrario, espera un poco a que alguno de los foristas te pueda responder.

Ahora bien, volviendo a tu pregunta

1
Mi pregunta es que hay que modificar dentro del CONCAT.

Lo único que tienes que hacer es comparar lo que tienes contra lo que yo puse en el ejemplo:

Tu linea:
1
set @sql = concat('Insert from ',tabla, values (campo1))

Mi línea:
1
SET @SQL = CONCAT('INSERT INTO ', tabla, ' VALUES (', campo1, ')');

Como te dije en mi POST, la función CONCAT recibe como parametros n cadenas, las cuales va a concatenar, en tu caso, NO ESTAS MANDANDO LA PARTE DE VALUES COMO CADENA sino que estas enviando sin COMILLAS, por lo tanto, hay un error de sintaxis.

En otras palabras no es lo mismo que pongas CONCAT(hola, mundo) a que pongas CONCAT('hola', 'mundo')

Te sugiero que antes que que trates de ejecutar la sentencia, primero te asegures de que esta se esté formando correctamente, es por eso que en el ejemplo que puse NO LA EJECUTO, sino que la estoy mandando como parámtero de SALIDA.

1
Leonardo esto es un Procedimiento Almacenado. Por eso la pregunta de si lo que tengo que modificar dentro del CONCAT sería suficiente para que funcione pues el CALL lo genera automáticamente el Procedimiento.

Como en mi ejemplo estoy agregando un parámetro de salida, entonces hay que modificar el CALL, pero si tú no quieres agregar ese parámetro de salida no lo hagas, pero así te resultará más complicado darte cuenta de tu error:

Esta es la modificación realizada pero da error.

1
set @sql = concat('Insert from ',tabla, 'campo1');

Obviamente esto te marcará error, ya que el INSERT NO QUEDA BIEN CONFORMADO, la variable @SQL al final, tendría como resultado algo así:

1
Insert tabla campo1,campo2

si tratas de ejecutar esto en consula, obviamente obtendrás un error.

Mucho Ojo, no esperes encontrar en el foro una respuesta sólo para copiar y pegar y que funcione al 100%, aquí encontraras tips y ayudas que te pueden ser de utilidad, pero al final de cuentas tendrás que hacer los ajustes necesarios para adecuarte a tus necesidades.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 102
Bronce
Ha disminuido 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por Miguel (60 intervenciones) el 19/06/2018 18:31:32
Gracias por responderme. Quería decirte que yo no tengo ninguna prisa pues me metí en este mundillo porque me gusta y dado que estoy jubilado desde hace siete años lo que me sobra es tiempo y lo que hago es para pasar el rato y no pensé que en estos foros suscitara ningún problema hacer una serie de preguntas seguidas para aclarar una contestación dada por una persona del foro.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Error en un Insert

Publicado por leonardo_josue (414 intervenciones) el 19/06/2018 22:11:27
Hola de nuevo Miguel:

El problema no es el número tan seguido de entradas, sino que en todas hablas de lo mismo y en realidad no se aporta nada nuevo al post original ni preguntas algo distinto a lo planteado en la primer respuesta.

Si checas, el foro te permite volver a EDITAR tu post para completar, corregir, borrar, etc. lo que consideres pertinente, de tal suerte que el post sea tan conciso como sea posible y tan claro como sea necesario.

Tienes un espacio de 15 minutos para hacer esta edición y no hacer entradas duplicadas, como es el caso. Una vez concluido este tiempo, el foro "cierra" tu pregunta y entonces se da pie a que comiencen a responder los foristas.

En mi caso, cuando entré por segunda vez, vi que tu post tenía ya 5 entradas, así supuse que alguien más ya te había contestado. Esa es la razón principal por la que te sugiero no abrir tantas entradas si no es estrictamente necesario.

Felicidades por involucrarte en este mundo y esperemos poder ser de ayuda.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar