Inicio > MySql > Recursividad en Mysql – ERROR 1456 (HY000): límite recursivo 0 (según lo establecido por la variable max_sp_recursion_depth)

Recursividad en Mysql – ERROR 1456 (HY000): límite recursivo 0 (según lo establecido por la variable max_sp_recursion_depth)


   La primera vez que utilizo la recursividad, no entendía en absoluto lo que está pasando. La mayoría de los compiladores e intérpretes no lo soportan y la gente suele buscar soluciones no recursivas.

Implícitamente, MySQL no permite llamadas recursivas de los procedimientos. Pero esto no es un problema. Es fácil cambiar el max_sp_recursion_depth variable del sistema:

SET @@max_sp_recursion_depth = 254 ;

Un ejemplo de un procedimiento almacenado recursivo.

CREATE DEFINER=`root`@`%` PROCEDURE `spAnulasRegistroDocumentos`(cEstado CHAR(1),nId_Usuario INT,
cMotivo Varchar(100),nId_RegDocumento INT)
BEGIN

    DECLARE nId_RegDocumentoCur INT ;
    DECLARE l_last_row INT DEFAULT 0 ;
    DECLARE nTotal INT DEFAULT 0;
   
    DECLARE cHijos CURSOR FOR SELECT Id_RegDocumento FROM RegistroDocumentos WHERE Id_RegDocumentoRaiz = nId_RegDocumento ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row=1 ;
   
    /* Habilitando para que pueda ejecutar funciones recursivas */
    SET @@max_sp_recursion_depth = 254 ;
   
    UPDATE RegistroDocumentos SET Estado = cEstado, Id_UsuarioAnula = nId_Usuario, MotivoAnula = cMotivo, FechaHoraAnula = NOW() WHERE Id_RegDocumento = nId_RegDocumento ;
    UPDATE RegistroDocumentos SET Estado = cEstado, Id_UsuarioAnula = nId_Usuario, MotivoAnula = cMotivo, FechaHoraAnula = NOW() WHERE Id_RegDocumentoRaiz = nId_RegDocumento ;
       
    /* Abrimos el cursor para empezar a recorrerlo */
    OPEN cHijos;
    c1_loop: LOOP

        /* Cada registro se le otorga a la variable nId_RegDocumentoCur */
        FETCH cHijos INTO nId_RegDocumentoCur;
        IF (l_last_row=1) THEN
            LEAVE c1_loop;
        END IF ;

        /* Lógica propia de este procedure */       
        SELECT COUNT(Id_RegDocumentoRaiz) INTO nTotal FROM RegistroDocumentos WHERE Id_RegDocumentoRaiz = nId_RegDocumento ;
        IF nTotal > 0 THEN
            CALL spAnulasRegistroDocumentos(cEstado,nId_Usuario,cMotivo,nId_RegDocumentoCur) ;
        END IF ;

    END LOOP c1_loop;

    /* cerramos el cursor */
    CLOSE cHijos;

END

Categorías:MySql
  1. Diego
    8 septiembre 2010 a las 1:27 pm

    Gracias compa, muy buen post…

  2. 27 diciembre 2010 a las 8:28 pm

    Gracias por el artículo sobre recursividad en Mysql. Hace tiempo que buscaba una solución.

  1. 19 julio 2010 a las 8:58 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: