MySQL - Store Procedure no ejecuta inserts.

   
Vista:

Store Procedure no ejecuta inserts.

Publicado por Emerson Palacios (29 intervenciones) el 31/05/2008 04:34:14
hola amigos, que tal???. bueno amigos queria pedirles ayuda son un store procedure que me tiene loco, bueno mas o menos le explico de que se trata el store bueno pasa que tengo un grupo de bases de datos las cuales tienes la misma estructura y en algunas tablas de estas bases de datos quiero que se tengan los mismos datos para lo cual he diseñado un procedure que cuando uno ingresa un campo en una base de datos automaticamente este se ingresa en todo el grupo de bases de datos. el procedure es el siguiente:
DELIMITER //
CREATE PROCEDURE INSERTA (in tabla VARCHAR(20),in nombre VARCHAR(30))
begin
declare done INT default 0;
declare base varchar(50);
declare basetabla varchar(100);
declare campo varchar(20);
declare bases cursor for select replace(ntienda,' ','') from tiendas;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
open bases;
REPEAT
IF NOT done THEN
FETCH bases INTO base;
set basetabla = CONCAT(base,'.',tabla);
set campo = CONCAT('N',tabla);
select basetabla,campo,valor1,valor2;
insert into basetabla (campo,eliminado) values (nombre,'1');
end if;
UNTIL done END REPEAT;
close bases;
end//
DELIMITER ;

si borro la linea del insert el procedure me devuelve el valor de las variables de lo mas normal osea que el procedure sintacticamente esta bien. Cuando le pongo el insert tambien me acepta grabar el procedure. pero los problemas vienen al ejecutarlo me sale el siguiente error " ERROR 1146 : Table 'almacencentral.basetabla' doesn't exist ". como veran basetabla es mi variable y la utilizo justo despues del INSERT INTO por lo que me parece que el motor de la base de datos erroneamente esta tomando el nombre de mi variable BASETABLA y no el valor que esta guarda y lo peor de todo es que lo esta uniendo con el nombre de la base de datos donde se esta ejecutando el store. bueno el problemas es como le digo al MYSQL que Basetabla es una variable. noten que una linea arriba del insert, hay un select y este si me muestra correctamente los valores de las variables. a ver si me dan una manito. Muchas gracias de antemano.
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

RE:Store Procedure no ejecuta inserts.

Publicado por Gonzalo GC (339 intervenciones) el 31/05/2008 15:48:15
Lo que tienes que hacer es crear una sentencia preparada con el string que estás creando y ejecutarla.
Fiajate en el manual: http://dev.mysql.com/doc/refman/5.0/es/sqlps.html
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

RE:Store Procedure no ejecuta inserts.

Publicado por Emerson Palacios (29 intervenciones) el 31/05/2008 21:45:53
Bueno Gonzalo gracias por la ayuda. ya hice lo que me dijiste pero la verdad no se que anda mal pues pareciera que todo esta bien sin embargo me tira un error a ver si me ayudas.
DELIMITER //
CREATE PROCEDURE INSERTA (in tabla VARCHAR(20),in nombre VARCHAR(30))
begin
declare done INT default 0;
declare base varchar(50);
declare bases cursor for select replace(ntienda,' ','') from tiendas;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
open bases;
REPEAT
IF NOT done THEN
FETCH bases INTO base;
set @s = 'insert into ? (?) values(?)';
/*PREPARE stmt2 FROM @s;*/
set @b = CONCAT(base,'.',tabla);
set @c = CONCAT('N',tabla);
set @n = nombre;
select @b,@c,@n;
/*EXECUTE stmt2 USING @b,@c,@n;*/
end if;
UNTIL done END REPEAT;
close bases;
end//
DELIMITER ;

Como veras el prepare lo tengo como comentario pues basta que le habilite para que me salte este error "ERROR 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" ,si lo pongo como comentario el select me lista sin ningun problema las variables. al parecer el mysql no reconoce el prepare, bueno a ver si me das una mano x favor que me estoy tardando ya mucho con esto. de antemano gracias por tu ayuda.
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

Ya lo solucione

Publicado por Emerson Palacios (29 intervenciones) el 09/06/2008 18:38:39
problema solucionado. gracias el prepare sirve lo malo que ya le tienes que ntregar la sentencia preparada y no enviarle parametros me funciono bien de esa manera.
DELIMITER //
CREATE PROCEDURE INSERTA (in tabla VARCHAR(20),in nombre VARCHAR(30))
begin
declare done INT default 0;
declare base varchar(50);
declare bases cursor for select replace(ntienda,' ','') from tiendas;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
/* 'insert into ? (?) values(?)';*/
set @c:= CONCAT('N',tabla);
set @n:= nombre;
open bases;
REPEAT
FETCH bases INTO base;
IF NOT done THEN
set @b:= CONCAT(base,'.',tabla);
set @d = concat('insert into ', @b,' (',@c,',eliminado) values (''',@n,''',''1'')');
PREPARE stmt2 FROM @d;
EXECUTE stmt2;
DROP PREPARE stmt2;
end if;
UNTIL done END REPEAT;
close bases;
end//
DELIMITER ;

como veran en la variable @d concateno toda la sentencia con las variables y despues la asigno al prepare y lo ejecuto sin pasarle ningun parametro.
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