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

stored procedure dinamico

Estas en el tema de stored procedure dinamico en el foro de Mysql en Foros del Web. que tal amigos, estoy trabajando con este procedimiento almacenado, la intencion es hacerlo generico, la parte del insert ya esta, le mando la tabla, los ...
  #1 (permalink)  
Antiguo 17/03/2010, 13:12
 
Fecha de Ingreso: agosto-2009
Mensajes: 44
Antigüedad: 14 años, 8 meses
Puntos: 1
stored procedure dinamico

que tal amigos, estoy trabajando con este procedimiento almacenado, la intencion es hacerlo generico, la parte del insert ya esta, le mando la tabla, los campos de la tablas y los valores respectivos, pero ahora antes de eso debo verificar si ese dato no existe y tmb debe ser dinamico, le mando un valor y el campo que debe de chekar mi problema es a la hora de ejecutar ese query ( en negrito ) dentro del IF, a ver si alguien tiene una propuesta, saludos

CREATE DEFINER=`root`@`localhost` PROCEDURE `spInsertGenerico`(
IN in_validador_campo varchar(255),
IN in_validador_valor varchar(255),
IN in_table varchar(255),
IN in_campos text,
IN in_valores text
)
MODIFIES SQL DATA
BEGIN
SET @query = CONCAT('SELECT * FROM ',in_table,' WHERE ',in_validador_campo,' = ',in_validador_valor);
PREPARE stmt FROM @query;
IF NOT EXISTS (EXECUTE stmt) THEN
SET @qry = CONCAT('INSERT INTO ',in_table,' (',in_campos,') VALUES (',in_valores,')');
PREPARE stmt1 FROM @qry;
EXECUTE stmt1;
END IF;
END
  #2 (permalink)  
Antiguo 17/03/2010, 13:56
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, 4 meses
Puntos: 2658
Respuesta: stored procedure dinamico

Nunca intenté usar una sentencia preptarada en un IF, pero de funcionar lo que debes buscar es un resultado por NULL, ya que en MySQL NOT EXISTS se usa para objetos de base de datos, y no para consultas.

Pruebalo así y veamos
Código MySQL:
Ver original
  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `spInsertGenerico`(
  2.   IN in_validador_campo varchar(255),
  3.   IN in_validador_valor varchar(255),
  4.   IN in_table varchar(255),
  5.   IN in_campos text,
  6.   IN in_valores text)
  7.   SET @query = CONCAT('SELECT * FROM ',in_table,' WHERE ',in_validador_campo,' = ',in_validador_valor);
  8.   PREPARE stmt FROM @query;
  9.   IF (EXECUTE stmt) IS NULL THEN
  10.     SET @qry = CONCAT('INSERT INTO ',in_table,' (',in_campos,') VALUES (',in_valores,')');
  11.     PREPARE stmt1 FROM @qry;
  12.     EXECUTE stmt1;
  13.   END IF;
  14.   DEALLOCATE PREPARE stmt;
  15.   DEALLOCATE PREPARE stmt1;

Tip:
No te olvides que debes eliminar la sentencia una vez usada, o de lo contrario te dará error si la mandas a ejecución en la misma conexión.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 17/03/2010, 14:04
 
Fecha de Ingreso: agosto-2009
Mensajes: 44
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: stored procedure dinamico

QUE TAL gnzsoloyo acabo de intentarlo de la manera que sugeriste y me marca error, a ti no te salio error?
  #4 (permalink)  
Antiguo 17/03/2010, 15:34
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, 4 meses
Puntos: 2658
Respuesta: stored procedure dinamico

¿Qué error te salió?
¿Cuándo?
¿Al compilarlo o al ejecutarlo?
__________________
¿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 17/03/2010, 15:44
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, 4 meses
Puntos: 2658
Respuesta: stored procedure dinamico

Ya lo probé.
MySQL no admite el EXECUTE dentro de un IF/END IF.
Lo que te conviene es hacerlo de otro modo:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `spInsertGenerico` $$
  4. CREATE PROCEDURE `spInsertGenerico`(
  5.   IN in_validador_campo VARCHAR(255),
  6.   IN in_validador_valor VARCHAR(255),
  7.   IN in_table VARCHAR(255),
  8.   IN in_campos TEXT,
  9.   IN in_valores TEXT)
  10.   SET @query = CONCAT('SELECT ', in_validador_campo, ' INTO @RESULT FROM ',in_table,' WHERE ',in_validador_campo,' = ',in_validador_valor);
  11.   PREPARE stmt FROM @query;
  12.   IF (@RESULT) IS NULL THEN
  13.     SET @qry = CONCAT('INSERT INTO ',in_table,' (',in_campos,') VALUES (',in_valores,')');
  14.    PREPARE stmt1 FROM @qry;
  15.     EXECUTE stmt1;
  16.   END IF;
  17.   DEALLOCATE PREPARE stmt;
  18.   DEALLOCATE PREPARE stmt1;
  19. END $$
  20.  
  21. DELIMITER ;

No he probado si resulta...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 17/03/2010, 17:53
 
Fecha de Ingreso: agosto-2009
Mensajes: 44
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: stored procedure dinamico

saludos de nuevo gnzsoloyo, la solucion parece interesante, pero en @RESULT no me regresa nada, no cacha el resultado del query, ya le estuve moviendo un poco mas y no sale, te agradesco tu ayuda.
  #7 (permalink)  
Antiguo 17/03/2010, 20: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, 4 meses
Puntos: 2658
Respuesta: stored procedure dinamico

El objetivo es precisamente detectar el NULL como resultado, pero no puedes usarlo para tomar un registro porque en MySQL no existe el tipo de dato ROW, TABLE ni LINE, por eso lo cambié por un sólo campo.
Además, las variables de usuario no tienen tipo hasta que se les asigna un valor, por lo que en realidad si la consulta devuelve NULL es correcto. De lo contrario tomaría el valor del ID retornado.
La única duda es si una variable de usuario puede ser utilizada dentro del string que crea una sentencia preparada...
Eso no lo he probado aún.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 17/03/2010, 21:46
 
Fecha de Ingreso: agosto-2009
Mensajes: 44
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: stored procedure dinamico

pues si se puede, ya esta funcionando, muchas gracias por la ayuda/orientada :) saludos
  #9 (permalink)  
Antiguo 19/03/2010, 12:14
 
Fecha de Ingreso: noviembre-2007
Mensajes: 5
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: stored procedure dinamico

Hola: veo que ustedes conocen sobre sp, quisiera saber que ocurre si en un store procedure creo una tabla temporal por ejemplo llamada prueba, la cual uso para rellenar con datos y devolverla, si hay varios usuarios de la red que llaman simulataneamente al store funcionara correctamente ? Gracias
  #10 (permalink)  
Antiguo 19/03/2010, 12:35
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, 4 meses
Puntos: 2658
Respuesta: stored procedure dinamico

Vamos por parte:
- Las tablas temporales nacen y mueren dentro de un SP, por lo que no permanecen más allá del procedure. Para hacerlas durar mas o las creas por fuera del SP, o bien creas una tabla sin definirla como TEMPORARY.
- Las tablas TEMPORARY definidas fuera de un SP existen y dependen del thread de conexión, por lo que si la conexión se cierra o se pierde, las tablas también.

Finalmente:
- Si tienes una pregunta que hacer, no te cuelgues de un post ajeno. No es muy cortés. Es mejor abrir uno propio, o mandar un MP, para el caso, ya que uno no lee los posts por lo que dice la última pregunta sino por lo que dice el que creó el post... Con lo que nadie ve tu pregunta hasta leer el último mensaje.
No es una buena idea...


Saludos y bienvenido al Foro.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: dinamico, procedure, stored
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 20:08.