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

Procedimientos Almacenados

Estas en el tema de Procedimientos Almacenados en el foro de Mysql en Foros del Web. Buenas Tardes Compañeros de ForosdelWeb !¡!¡ Mi pregunta es la siguiente: Quiero desarrollar un procedimiento que me permita determinar si un registro existe en la ...
  #1 (permalink)  
Antiguo 01/09/2010, 11:02
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 2 meses
Puntos: 0
Procedimientos Almacenados

Buenas Tardes Compañeros de ForosdelWeb !¡!¡

Mi pregunta es la siguiente:

Quiero desarrollar un procedimiento que me permita determinar si un registro existe en la base de datos... y dependiendo de si existe o no.. hacer un insert y un update de dicho registro... En la web encontre el siguiente ejemplo que he adaptado:
Yo envio por parametro la variable de vcodigo (codigo del producto), vnombre(nombre del producto) y finalmente envio tambien vtabla (el nombre de la tabla)

BEGIN

DECLARE existe bool;
select count(*)> 1 into existe from grupo where grupo.codigo = vcodigo;

if existe then
UPDATE grupo set nombre = vnombre where codigo= vcodigo;
else
INSERT INTO grupo (codigo, nombre) values (vcodigo,vnombre );
end if;

end;

Este prodecimiento funciona bien ... pero como habran notado no utilizo el parametro vtabla por que cuando llamo al procedimiento asi: call grupo('22', 'grupo','prueba n° 2')
donde codigo = 22
tabla = grupo
nombre = prueba n° 2

Pero si en lugar de colocar la variable de vtabla directamente no me funciona... Me dice que la tabla vtabla no existe... aparentemente no toma como parametro el nombre dela tabla... Entonces mi duda es saber como pasar por parametro el nombre de la tabla?¿

En la web consegui una forma de hacerlo... que es la siguiente:
set @tabla = concat ( 'select count(*) into ', existe, ' from ', vtabla, ' where grupo.codigo =', vcodigo );
set @tabla = concat ( 'select count(*) from ', vtabla, ' where codigo =', vcodigo );
PREPARE sentencia FROM @tabla;
execute sentencia;

Pero en este caso me sale el siguiente error : [Error] 1064 - Usted tiene un error en la sintaxis SQL, consulte el manual correspondiente a su versión del servidor MySQL para la sintaxis derecho al uso cerca 'NULL' en la línea 1

Sino utilizo la varianble existe me funciona chevere ... Pero la necesito para poder realizar la condición ¡!¡!

Muchas Gracias...

Saludos y Éxito!¡!¡
__________________
Fiorellita

Última edición por fiorella3247; 01/09/2010 a las 11:17
  #2 (permalink)  
Antiguo 01/09/2010, 14:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Procedimientos Almacenados

señorita...

Efectivamente la solución a tu problema son las sentencias preparadas.
Mira este post donde pongo un ejemplo de como concatenar las partes de la consulta para luego ser ejecutada. Tienes errores al concatenar existe como si fuese una variable.

Mira bien el ejemplo y trata de acomodarlo a tus necesidades.

saludos fiorella
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 01/09/2010, 18:47
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Procedimientos Almacenados

Cita:
Iniciado por huesos52 Ver Mensaje
señorita...

Efectivamente la solución a tu problema son las sentencias preparadas.
Mira este post donde pongo un ejemplo de como concatenar las partes de la consulta para luego ser ejecutada. Tienes errores al concatenar existe como si fuese una variable.


Hola Mi Danny.. gracias por responderme...

Sé que tengo error a concatenar la variable... pero necesito hacerlo para poder luego tener una variable que me permita determinar si existe el registro o no... cuano yo concateno de la siguiente forma me resulta bien :
Código MySQL:
Ver original
  1. set  @tabla concat ('select if(count(*)>0,true,false) as existe from ' vtabla 'where codigo = ' , vcodigo);
  2. PREPARE sentencia FROM @tabla;
  3. execute sentencia;

Pero cuando imprimo el valor de existe me sale null ... y pues no tengo mnera desaber cuando es insert o cuando es update ... Y necesito ese dato para hacer la sentencia if ... la sentencia como tan lo estaba haciendo bien... pero no tengo el existe ...

Help me !¡!¡

Besitos a Maria José !¡!¡
__________________
Fiorellita
  #4 (permalink)  
Antiguo 01/09/2010, 19:28
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Procedimientos Almacenados

Hola hola!!
creo que ya te entendí.
Pero no es así de facil. El almacena null por que nunca está ejecutando la sentencia para determinar el resultado. Solo está escribiendo la sentencia como tal.

Aunque nunca lo he probado, puedes abrir un cursor con la ejecuciòn de esa sentencia y obtener del cursor el verdadero valor de existe. Mira esto
http://www.webtutoriales.com/tutoria...-mysql.79.html

Mañana en el trabajo miro bien el tema y te digo si se puede hacer y te doy una respuesta mas certera.

saludos niña
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 02/09/2010, 09:39
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Procedimientos Almacenados

señorita...

No me ha salido.

El error que tienes es que dentro de una sentencia preparada no puedes llamar una variable, por lo que dice que no está declarada. Efectivamente la solución a tu problema es abrir la sentencia concatenada mediante un cursor para posteriormente acceder al valor true o false del count respectivo.

Ahora el problema es para abrir un cursor enviandole una sentencia SQL que es generada en una variable.

Encontré en esta pagina la forma como supuestamente se puede abrir un cursor con SQL dinamico, pero para serte sincero no me ha funcionado.

llegué hasta aca

Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE grupo(IN vcodigo VARCHAR(10),IN vtabla VARCHAR(10),IN vnombre VARCHAR(10))
  3. DECLARE existe BOOL;
  4. DECLARE query VARCHAR(500);
  5. SET query = CONCAT("SELECT IF(COUNT(*)>=1,TRUE,FALSE) AS existe1 FROM ",vtabla," WHERE codigo = '",vcodigo,"'");
  6. --PREPARE stmt FROM @query;
  7. EXEC('DECLARE cur CURSOR FOR ' + query);
  8. OPEN cur;
  9. cur_loop: LOOP
  10. IF d=1 THEN
  11.   LEAVE cur_loop;
  12.   FETCH cur INTO existe;
  13. END LOOP cur_loop;
  14. IF existe THEN
  15. UPDATE grupo set nombre = vnombre where codigo= vcodigo;   
  16. INSERT INTO grupo (codigo, nombre) values (vcodigo,vnombre);
  17. --CLOSE cur;
  18. $$
  19. DELIMITER ;

Pero sin resultados satisfactorios.

Esperemos que un mago de mysql te pueda ayudar a solucionar el problema y de paso nos enseñe algo nuevo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: procedimiento, almacenar
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 03:52.