MySQL - Error en Procedimiento almacenado

   
Vista:

Error en Procedimiento almacenado

Publicado por guschiriboga (2 intervenciones) el 24/02/2009 07:05:07
Hola, necesito crear un procedimiento almacenado para insertar un dato en la tabla que se envia como parametro al procedimiento.

Me explico mejor, tengo varias tablas que las llamo maestras, estas contienen un campo id, y un campo texto, por lo que quiero hacer un solo sp para insertar el dato texto en la tabla deseada.

Ya hice uno para hacer select pero, en este caso quiero optimizar el sp llamando una sola vez a la sentencia insert al final, pasandole los valores necesarios.

les dejo la sintaxis de creacion del sp, y el error que me esta dando.

tengo las tablas

ciudad
cui_id int(11) auto_increment
ciu_texto varchar(300)

departamento
depar_id int(11) auto_increment
depar_texto varchar(300)

he intentado las siguientes opciones y en todas me da un error de sintaxis...

---------------------------------
OPCION 1
---------------------------------

DELIMITER $$

CREATE PROCEDURE `orientanet`.`sp_insert_tablas_maestras` (in tabla varchar(50), in dato varchar(300))
BEGIN

declare campo_id varchar(30);
declare campo_texto varchar(30);

case tabla
when 'ciudad' then
campo_id='ciu_id';
campo_texto='ciu_texto';
when 'departamento' then
campo_id='depar_id';
campo_texto='depar_texto';
else select 'Error en tabla ingresada';
end case;

insert into tabla (campo_id, campo_texto) values (null, dato);

END $$

DELIMITER ;

DELIMITER $$

---------------------------------
OPCION 2
---------------------------------

DELIMITER $$

CREATE PROCEDURE `orientanet`.`sp_insert_tablas_maestras` (in tabla varchar(50), in dato varchar(300))
BEGIN

declare campo_id varchar(30);
declare campo_texto varchar(30);

select @tabla_insert := tabla;
select @dato_insert := dato;

case @tabla_insert
when 'ciudad' then
campo_id='ciu_id';
campo_texto='ciu_texto';
when 'departamento' then
campo_id='depar_id';
campo_texto='depar_texto';
else select 'Error en tabla ingresada';
end case;

insert into @tabla_insert (campo_id, campo_texto) values (null, @dato_insert);

END $$

DELIMITER ;

DELIMITER $$


---------------------------------
OPCION 3
---------------------------------

DELIMITER $$

CREATE PROCEDURE `orientanet`.`sp_insert_tablas_maestras` (in tabla varchar(50), in dato varchar(300))
BEGIN

select @tabla_insert := tabla;
select @dato_insert := dato;

insert into @tabla_insert values (null, @dato_insert);

END $$

DELIMITER ;

DELIMITER $$

---------------------

mi problema radica en la declaracion, asignacion y uso de las variables en el sp, ya que no me valida como variable al momento del insert....

Gracias por su ayuda en como puedo crear este sp, ya que en el ejemplo lo pongo para dos tablas pero en realidad son como 7 tablas que quiero manejar....
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:Error en Procedimiento almacenado

Publicado por Juan Manuel Castañeda (59 intervenciones) el 27/02/2009 21:35:43
Opcion 1:
set @dato_insert=dato;
Opcion 2:
select dato into @dato_insert;
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:Error en Procedimiento almacenado

Publicado por Gus Chiriboga (2 intervenciones) el 28/02/2009 00:08:04
Gracias Juan Manuel Castañeda por tu respuesta, el problema no es con el dato que envio a insertar, sino que no me reconoce a la variable que lleva el nombre de la tabla, es decir, toma la variable 'tabla' como si fuera el nombre de la tabla y no como una variable que contiene el nombre.
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:Error en Procedimiento almacenado

Publicado por Emerson Palacios (29 intervenciones) el 01/03/2009 17:26:00
Este problema le debe haber pasado a mucha gente que por primera vez programa procedrues,triggers en Mysql, lo malo que en internet no hay mucho sobre el tema me la pase preguntando en varios foros y nadie me daba una respuesta, hasta que encontre la solucion al problema casi de casualidad, despues de casi una semana (ya me estaba desesperando). bueno este pedazo de codigo lo saque de uno de mis procedures leelo detenidamente.

set @d = concat('delete from ',@t,'.cab_recepcion where NUMEROGUIA=''',numdoc,''' and ORIGEN=''',@O,'''' );
PREPARE stmt2 FROM @d;
EXECUTE stmt2;
DROP PREPARE stmt2;

Como veras para meter variables a una instruccion tienes que crear la sentencia en una una cadena en este caso la cadena es "@d" ahi se esta haciendo un delete en la base de datos de nombre "@t" especificamente en la tabla cab_recepcion el numero de guia a borrar es numdoc y el origen de esa guia es una tienda con el nombre contenido en la variable "@O " luego de tener lista la cadena preparas la instruccion con la sentencia:
PREPARE stmt2 FROM @d; , donde stmt2 es el nombre de la sentencia puedes poner el nombre que mejor te parezca. luego la ejecutas con: EXECUTE stmt2; y luego procedes a borrar la sentencia pues ya no te sirve DROP PREPARE stmt2; , bueno eso es todo espero que te sirva y como consejo debajo del concat pon un select @d para que revises tu sentencia antes de ejecutarla pues a veces te falta una comilla o algo que puede ocasionar un error por eso es preferible visualizar tu sentencia antes de ejecutarla una vez que estas seguro que funciona procedes a borrarla. bueno nos vemos. y espero que te sirva.
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