BUCLE DEL CURSOR dentro de la TRANSACCIÓN

Ni siquiera puedo hacer que este BUCLE DE CURSOR básico se ejecute en mi TRANSACCIÓN.

Por favor ayuda. ¡Gracias por adelantado!

CREATE PROCEDURE ClearItems(IN itemName CHAR)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE bID INT(255);
    DECLARE bIDs CURSOR FOR SELECT id FROM table1 WHERE column1 = itemName AND column2 = 'b' ORDER BY column3 DESC, date ASC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    START TRANSACTION;
        OPEN bIDs;
        clear_loop: LOOP
        FETCH bIDs INTO bID;
        IF done THEN
            LEAVE clear_loop;
            END IF;
        INSERT INTO table2 (column1) SELECT bID;
        END LOOP;
        CLOSE bIDs;
    COMMIT; 
END //
DELIMITER ;

preguntado el 22 de mayo de 12 a las 16:05

Compruebe los errores de sintaxis. -

Ninguno reportado. Todo pasa. ¿Los obtienes cuando lo pruebas? -

Esta línea arrojará algunos errores -'WHERE 1column1 = itemName AND 1column2 = 'b' ORDER BY 1column3 DESC'. El campo 1column1 y otros tienen que ser citados o nombrados correctamente. -

No entiendo. ¿Se citan las columnas? itemName es el valor del procedimiento IN. ¿No se puede hacer eso, buscando columnas en un DONDE con el valor IN? ¿O tiene que cambiar la sintaxis al hacer eso? Muchas gracias. -

Acabo de probarlo sin el LOOP e INSERTA un valor vacío. ¿Tiene que usar una sintaxis especial para CURSORES cuando usa DONDE? -

1 Respuestas

Para solucionar el problema, cambie el nombre de la variable ID declarada. Los nombres de campo y las variables no deben ser iguales.


Además, si desea completar otra tabla, intente usar INSERTAR ... SELECCIONAR declaración. Le ayudará a evitar el uso de cursores. Por ejemplo -

INSERT INTO table2(`2column1`)
  SELECT id
    FROM table1
    WHERE `1column1` = itemName AND `1column2` = 'b'
    ORDER BY `1column3` DESC, date ASC;

contestado el 22 de mayo de 12 a las 17:05

Lo siento de nuevo. Ese tampoco es el nombre real de la variable declarada. Lo cambiaré a un poco más cerca de lo que es. - usuario1382306

Tengo un conjunto completo de código que puse dentro de la transacción, por lo que no estoy tratando de hacer un INSERTAR. Solo estoy tratando de desmantelarlo hasta los huesos, para poder descubrir qué está mal. Creo que es la forma en que declaro, abro o busco el CURSOR, pero no tengo ni idea. - usuario1382306

Todavía está INSERTANDO 0 (NULL, supongo). El LOOP ni siquiera se disparó cuando lo probé. Debe haber algo mal con mi sintaxis en alguna parte. - usuario1382306

Comenté la parte "item = itemName" y el cursor funcionó. ¿Cómo puedo usar mi variable IN? Gracias de nuevo. - usuario1382306

El argumento 'itemName' se usa correctamente. Compruebe si inserta algo, escriba algo como esto: INSERTAR EN tabla2 (columna1) VALORES (1). También verifique si la consulta SELECT devuelve un conjunto de datos, simplemente ejecute esa consulta SELECT sin el cursor. - Devastar

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.