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

Problema con Stored Procedured

Estas en el tema de Problema con Stored Procedured en el foro de Mysql en Foros del Web. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SET @@ GLOBAL .max_sp_recursion_depth = 255 ; SET @@ session .max_sp_recursion_depth = 255 ;   DELIMITER $$ DROP PROCEDURE ...
  #1 (permalink)  
Antiguo 03/03/2014, 20:07
Avatar de Game[DxS]  
Fecha de Ingreso: noviembre-2003
Ubicación: Concepción Chile
Mensajes: 100
Antigüedad: 20 años, 5 meses
Puntos: 0
Problema con Stored Procedured

Código MySQL:
Ver original
  1. SET @@GLOBAL.max_sp_recursion_depth = 255;
  2. SET @@session.max_sp_recursion_depth = 255;
  3.  
  4. DELIMITER $$
  5. DROP PROCEDURE IF EXISTS control_activo_datos_dependencias_sp$$
  6.  
  7. CREATE PROCEDURE control_activo_datos_dependencias_sp (IN ID INT)
  8.  
  9. DECLARE var_idactivo INT;
  10. DECLARE var_act_idactivo INT;
  11. DECLARE var_dependencia INT;
  12.  
  13. INSERT INTO dependencia_temp SELECT idactivo, act_idactivo, tipodependencia from DEPENDENCIA where idactivo = ID;
  14.  
  15. DECLARE HIJOS CURSOR FOR SELECT idactivo, act_idactivo, tipodependencia from DEPENDENCIA where idactivo = ID;
  16. OPEN HIJOS;
  17. REPEAT FETCH HIJOS INTO var_idactivo, var_act_idactivo, var_dependencia;
  18.     control_activo_datos_dependencias_sp(var_act_idactivo);
  19. UNTIL done END REPEAT;
  20. CLOSE HIJOS;
  21.  
  22. END$$
  23. DELIMITER ;
[/CODE]

Me marca error al declarar el cursor, me podrían ayudar y decirme que estoy haciendo mal? Soy novato en SP's =/

Saludos y gracias de antemano.

Última edición por gnzsoloyo; 04/03/2014 a las 06:53
  #2 (permalink)  
Antiguo 04/03/2014, 07:12
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, 5 meses
Puntos: 2658
Respuesta: Problema con Stored Procedured

Cinco errores:
1) Toda declaración de objetos de tipo CURSOR debe hacerse antes de la ejecutción de cualquier otra sentencia SQL.
2) No creaste un HANDLER, por lo que tendrás problemas.
3) REPEAT no debe ir en la misma línea de la sentencia siguiente.
4) Todo llamado a un SP desde otro se hace por medio de CALL.
5) No existen los SP recursivos en MySQL, por lo que lo que estás intentando fallará.
Código SQL:
Ver original
  1. SET @@GLOBAL.max_sp_recursion_depth = 255;
  2. SET @@SESSION.max_sp_recursion_depth = 255;
  3.  
  4. DELIMITER $$
  5. DROP PROCEDURE IF EXISTS control_activo_datos_dependencias_sp$$
  6.  
  7. CREATE PROCEDURE control_activo_datos_dependencias_sp (IN ID INT)
  8. BEGIN
  9.  
  10.     DECLARE var_idactivo INT;
  11.     DECLARE var_act_idactivo INT;
  12.     DECLARE var_dependencia INT;
  13.     DECLARE HIJOS CURSOR FOR SELECT idactivo, act_idactivo, tipodependencia FROM DEPENDENCIA WHERE idactivo = ID;
  14.  
  15.     INSERT INTO dependencia_temp SELECT idactivo, act_idactivo, tipodependencia FROM DEPENDENCIA WHERE idactivo = ID;
  16.  
  17.     OPEN HIJOS;
  18.     REPEAT
  19.         FETCH HIJOS INTO var_idactivo, var_act_idactivo, var_dependencia;
  20.         CALL control_activo_datos_dependencias_sp(var_act_idactivo);
  21.     UNTIL done END REPEAT;
  22.     CLOSE HIJOS;
  23.  
  24. END$$
  25. 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)
  #3 (permalink)  
Antiguo 06/03/2014, 13:50
Avatar de Game[DxS]  
Fecha de Ingreso: noviembre-2003
Ubicación: Concepción Chile
Mensajes: 100
Antigüedad: 20 años, 5 meses
Puntos: 0
Respuesta: Problema con Stored Procedured

Gracias Gnzsolo yo, asi lo he solucionado:

Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE control_impacto_rec_dep_sp(IN ID INT)
  3.  
  4.  
  5.     DECLARE l_last_row INT DEFAULT 0 ;
  6.     DECLARE var_idactivo INT;
  7.     DECLARE var_act_idactivo INT;
  8.     DECLARE var_dependencia INT;
  9.     DECLARE cHIJOS CURSOR FOR SELECT idactivo, act_idactivo, tipodependencia from DEPENDENCIA where idactivo = ID;
  10.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1 ;
  11.    
  12.     /* Habilitando para que pueda ejecutar funciones recursivas */
  13.     SET @@max_sp_recursion_depth = 254 ;
  14.    
  15.     INSERT INTO dependencia_temp_table SELECT idactivo, act_idactivo, tipodependencia from DEPENDENCIA where idactivo = ID;
  16.        
  17.     /* Abrimos el cursor para empezar a recorrerlo */
  18.     OPEN cHijos;
  19.     c1_loop: LOOP
  20.  
  21.     FETCH cHijos INTO var_idactivo, var_act_idactivo, var_dependencia;
  22.        
  23.     IF (l_last_row=1) THEN
  24.             LEAVE c1_loop;
  25.         END IF ;
  26.        
  27.        
  28.         CALL control_impacto_rec_dep_sp(var_act_idactivo);
  29.  END LOOP c1_loop;
  30.  
  31.     /* cerramos el cursor */
  32.     CLOSE cHijos;
  33.  

Puedo hacer la función recursiva, ahora lo unico que me falta es que si esta linea: INSERT INTO dependencia_temp_table SELECT idactivo, act_idactivo, tipodependencia from DEPENDENCIA where idactivo = ID; no inserta nada, que termine el procedimiento, ya que cuando el select no trae datos, en la aplicación me da error.

Saludos y gracias por la ayuda :).

Etiquetas: select, 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 13:39.