Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Insert Multiple en Stored Procedure

Estas en el tema de Insert Multiple en Stored Procedure en el foro de Mysql en Foros del Web. Hola a todos les paso a contar mi problema estoy tratando de hacer un insert multiple dentro de un stored procedure, lo que estoy intentando ...
  #1 (permalink)  
Antiguo 24/05/2012, 11:05
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 2 meses
Puntos: 47
Insert Multiple en Stored Procedure

Hola a todos les paso a contar mi problema estoy tratando de hacer un insert multiple dentro de un stored procedure, lo que estoy intentando hacer es pasarle en un parametro de texto al procedimiento la cadena con los valores que quiero que cargue en mi tabla, esto seria:

(1,1,8,4),
(1,2,6,7),
(1,3,5,5),
(1,4,3,3),
(1,5,6,2);

el codigo de mi procedimiento es este:

Código MySQL:
Ver original
  1. CREATE PROCEDURE `llenarDatos`(llenar TEXT)
  2. PREPARE consulta FROM CONCAT('INSERT INTO detalle VALUES ',llenar);
  3. EXECUTE consulta;

entonces dentro del procedimiento lo que intento hacer es usar prepare y execute para ejecutar una consulta de texto, entonces concateno los valores con un "INSERT INTO detalle VALUES ", pero por alguna razon el mysqlworkbench me arroja un error de sintaxis ya que no me deja compilar el procedimiento, existe algun error en mi codigo? o hay alguna forma mas correcta de hacer esto?

Desde ya gracias por leer mi pregunta, Saludos
  #2 (permalink)  
Antiguo 24/05/2012, 12:02
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Insert Multiple en Stored Procedure

Hola djaevi:

No estoy seguro de que puedas utilizar la función CONCAT para preparar una sentencia. Inténtalo así:

Código:
DROP PROCEDURE IF EXISTS llenarDatos;
DELIMITER $$

CREATE
    PROCEDURE llenarDatos(llenar VARCHAR(100))
    BEGIN
	SET @temp = CONCAT('INSERT INTO tabla VALUES ', llenar);
	PREPARE consulta FROM @temp;
	EXECUTE consulta;
	DEALLOCATE PREPARE consulta;
    END$$

DELIMITER ;
Aquí estaría funcionando el SP:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. +------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> CALL llenarDatos("(4, 'cuatro'), (5, 'cinco')");
  12. Query OK, 0 rows affected (0.04 sec)
  13.  
  14. mysql> SELECT * FROM tabla;
  15. +------+-------------+
  16. | id   | descripcion |
  17. +------+-------------+
  18. |    1 | uno         |
  19. |    2 | dos         |
  20. |    3 | tres        |
  21. |    4 | cuatro      |
  22. |    5 | cinco       |
  23. +------+-------------+
  24. 5 rows in set (0.00 sec)

Recuerda siempre eliminar las sentencias preparadas con DEALLOCATE PREPARE

Haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 24/05/2012, 19:43
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 2 meses
Puntos: 47
Respuesta: Insert Multiple en Stored Procedure

Gracias maestroooo!!! lo probe y anda espectacular muchas gracias!!

Te hago una unica pregunta que me quedo para entender...

que diferencia hay entre declarar una variable usando

DECLARE temp VARCHAR(200);
SET temp = CONCAT('INSERT INTO torneos_estado VALUES ', llenar);

a usar

SET @temp = CONCAT('INSERT INTO torneos_estado VALUES ', llenar);

solo lo pregunto porque he visto codigos que usan el arroba tambien y no entiendo la diferencia entre declarar las variables de una y otra forma, mil gracias nuevamente.

Saludos
  #4 (permalink)  
Antiguo 24/05/2012, 21:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Insert Multiple en Stored Procedure

Las variables que llevan "@" son las llamadas de usuario o de sesión, y son diferentes de las locales de los SP.
Estas variables:
- Su entorno de existencia es la misma pila de memoria donde se maneja la sesión.
- No se declaran, sino que se nacen al ser invocadas por vez primera.
- Como su entorno de existencia es la sesión de la conexión en que se usan, sólo mueren cuando la conexión se termina.
- Carecen de tipo de dato. En su lugar, adoptan el tipo con el que se las inicializa (por lo que siempre se las debe incializar).
- Mientras no se las inicialice, su su valor es NULL.
- Conservan su valor mientras la conexión siga viva, por lo que cada vez que un SP las usa debe forzosamente reinicializarlas para evitar datos basura.
- Si se las crea en un SP, pueden ser accedidas luego desde otro, o desde el entorno de sesión, manteniendo su último valor siempre.

Las variables sin ese prefijo son locales de los SP, y:
- Sólo existen mientras dura el SP, es decir que su entorno es temporal y se ubica en una pila de memoria de diferente a las de usuario. Nacen y mueren con la ejecución del SP.
- Debe declararse su tipo de dato, y no pueden cambiar de tipo.
- No pueden ser invocadas por fuera del SP.

El tema es que como las sentencia preparadas se ubican en el ambiente de sesión (conexión), es imposible usar variables locales para crearlas, precisamente porque esas pertenecen a otro entorno. Por eso sólo se puede construir una sentencia preparada con variables de usuario.
¿Se entiende el problema?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 24/05/2012, 23:54
Avatar de gerardo_goh  
Fecha de Ingreso: noviembre-2008
Mensajes: 107
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Insert Multiple en Stored Procedure

me puedes explicar lo de la palabra consulta, soy novato en esto, ayudame, saludos!!!

DROP PROCEDURE IF EXISTS llenarDatos;
DELIMITER $$

CREATE
PROCEDURE llenarDatos(llenar VARCHAR(100))
BEGIN
SET @temp = CONCAT('INSERT INTO tabla VALUES ', llenar);
PREPARE consulta FROM @temp;
EXECUTE consulta;
DEALLOCATE PREPARE consulta;
END$$

DELIMITER ;
  #6 (permalink)  
Antiguo 25/05/2012, 07:45
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 2 meses
Puntos: 47
Respuesta: Insert Multiple en Stored Procedure

gnzsoloyo muchisimas gracias por la explicacion quedo me quedo todo perfectamente claro ahora voy a tener mas claro que tipos de variables usar en mis SP :D.

Gerardo consulta es un alias que se le da a lo que se va a ejecutar, tu le das el nombre que tu quieras lo que importa es que luego pongas FROM @variableDeConsulta EJ:

Código MySQL:
Ver original
  1. SET @textoConConsulta = 'SELECT * FROM mitabla';
  2. PREPARE unNombre FROM @textoConConsulta;
  3. EXECUTE unNombre;
  4. DEALLOCATE PREPARE unNombre;

Saludos!

Etiquetas: insert, procedure, sql, stored, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:22.