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

Ayuda con procedimiento almacenado parametrizado

Estas en el tema de Ayuda con procedimiento almacenado parametrizado en el foro de Mysql en Foros del Web. Hola, Quisiera saber si se puede crear un procedimiento almacenado del tipo insert into, que me sirva para insertar registros para varias tablas, yo lo ...
  #1 (permalink)  
Antiguo 14/11/2009, 18:48
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Pregunta Ayuda con procedimiento almacenado parametrizado

Hola,

Quisiera saber si se puede crear un procedimiento almacenado del tipo insert into, que me sirva para insertar registros para varias tablas, yo lo he hecho en sqlserver, pero aqui no tengo ni idea.

insert into nombre_tablas values (valores_campos);

Agradezco mucho sus aportes.


OSCAR QUINTERO
  #2 (permalink)  
Antiguo 14/11/2009, 19:43
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

Bueno era muy sencillo, mas que en mssql, solo se parametrizan las variables y se envian desde la aplicación:

DELIMITER $$

CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `dbiglesia`.`sp_AgregarRegistros`(IN strTabla TEXT, IN strCampos TEXT, IN strValores TEXT)
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
INSERT INTO strTabla (strCampos) VALUES(strValores);
END$$

DELIMITER ;
  #3 (permalink)  
Antiguo 14/11/2009, 19:59
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: Ayuda con procedimiento almacenado parametrizado

Ten cuidado con los parámetros.
Los SP en MySQL no admiten, hasta lo que sé, valores TEXT, LOB o BLOB. Además, para poder pasar el nombre de una tabla como parámetro, tienes que usar sentencias preparadas dentro del cuerpo del SP.
El esquema de lo que necesitas andaría por aquí:
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `dbiglesia`.`sp_AgregarRegistros`
  4.   (IN strTabla VARCHAR(50),
  5.    IN strCampos VARCHAR(250),
  6.    IN strValores VARCHAR(250))
  7. BEGIN
  8.    PREPARE stmt1 FROM 'INSERT INTO ?(?) VALUES(?)';
  9.    SET @a = strTabla;
  10.    SET @b = strCampos;
  11.    SET @c = strValores;
  12.    EXECUTE stmt1 USING @a, @b, @c;
  13.    DEALLOCATE PREPARE stmt1;
  14. END$$
  15.  
  16. DELIMITER ;
Aunque me parece que lo que estás buscando es un método para crear sentencias de inserción en forma dinámica, tanto en lo que al nombre de la tabla se refiere, como en cuanto a los campos y valores.
No me parece una forma eficiente lo que estás haciendo si eso es lo que buscas, porque esas construcciones dinámicas se logran mejor en las aplicaciones. Al menos yo lo hago en VB.Net de esa forma.

Los SP tienen más sentido cuando se trata de tareas repetitivas que se realizan sobre las mismas tablas y valores siempre. Poner a hacer algo tan variable puede eventualmente conspirar contra la seguridad de la base, ya que un SP puede ser ejecutado generalmente por cualquier persona sin privilegios de UPDATE e INSERT, sólo de EXECUTE. Darles la oportunidad de hacerlo como propones puede permitirles afectar tablas que no deberían poder acceder.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 14/11/2009 a las 20:04
  #4 (permalink)  
Antiguo 14/11/2009, 20:01
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

ok, muchas gracias, lo revisare...
  #5 (permalink)  
Antiguo 14/11/2009, 20:12
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

Si es para una aplicación en C#, pues la idea es crear unos procedimientos para unas tareas especificas: actualizacion, creacion y consultas, agradezco mucho sus comentarios.
  #6 (permalink)  
Antiguo 14/11/2009, 21:18
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

Hola gnzsoloyo,

Estuve probando el SP, pero me arroja un error al intentar pasar datos:

CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `dbbase`.`sp_AgregarRegistros`(IN varTabla VARCHAR(50), IN varCampos VARCHAR(250), IN varValores VARCHAR(250))
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
PREPARE stmt1 FROM 'INSERT INTO ? (?) VALUES(?)';
SET @a = varTabla;
SET @b = varCampos;
SET @c = varValores;
EXECUTE stmt1 USING @a, @b, @c;
DEALLOCATE PREPARE stmt1;
END$$

DELIMITER ;

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? (?) VALUES(?)' at line 1

Estuve buscando algun tema referente, pero no encuentro nada, le agradezco en lo que me pueda ayudar.
  #7 (permalink)  
Antiguo 14/11/2009, 22:02
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: Ayuda con procedimiento almacenado parametrizado

Quitale la basura al script.
Parece que has copiado un modelo de algún manual on-line, en el que se describe la sintaxis sin reparar en que parte del código es solo ejemplificador.
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `sp_AgregarRegistros` $$
  4. CREATE PROCEDURE `sp_AgregarRegistros`
  5.   (IN strTabla VARCHAR(50),
  6.    IN strCampos VARCHAR(250),
  7.    IN strValores VARCHAR(250))
  8. BEGIN
  9.    SET @sent =CONCAT('INSERT INTO ', strTabla, '(', strCampos, ') VALUES(', strValores, ')');
  10.    PREPARE stmt1 FROM @sent;
  11.    EXECUTE stmt1;
  12.    DEALLOCATE PREPARE stmt1;
  13. END$$
  14.  
  15. DELIMITER ;
__________________
¿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 14/11/2009, 22:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

Muchas gracias por su ayuda, esta funcionando pero hay un detalle solo me deja pasar un solo valor por ejemplo:

CALL sp_AgregarRegistros("saludo","saludo",1), esto si pasa,

pero si pongo

CALL sp_AgregarRegistros('saludo','saludo','gato'), me marca este error:

Error Code : 1054
Unknown column 'gato' in 'field list',

Aclaro que estoy haciendo una prueba con una tabla que tiene un solo campo.
  #9 (permalink)  
Antiguo 15/11/2009, 06:19
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: Ayuda con procedimiento almacenado parametrizado

porque está entrando "gato" sin los apóstrofes, y al combinar queda :
Código sql:
Ver original
  1. INSERT INTO salud(saludo) VALUES(gato);
En ese contexto, "gato dejó de ser un string y pasó a ser un nombre de campo.
Para que la cosa funcione, la cadena enviada debe contener el valor encerrado entre apóstrofes .
Escapados:
Código sql:
Ver original
  1. CALL sp_AgregarRegistros('saludo','saludo','\'gato\'');

Sobrecargados:
Código sql:
Ver original
  1. CALL sp_AgregarRegistros('saludo','saludo',''gato'');
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 15/11/2009, 11:17
 
Fecha de Ingreso: febrero-2007
Mensajes: 32
Antigüedad: 17 años, 2 meses
Puntos: 0
Respuesta: Ayuda con procedimiento almacenado parametrizado

ok, funciona perfecto, muchas gracias
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 16:49.