Un HANDLER
serve per catturare le eccezioni.
Durante la lettura da un cursore, la lettura oltre la fine del cursore genera un NOT FOUND
eccezione, piuttosto che restituire un flusso infinito di NULL
, quindi devi catturare questa eccezione.
DECLARE val1 INT DEFAULT NULL;
DECLARE done TINYINT DEFAULT FALSE;
DECLARE c1 CURSOR FOR SELECT id FROM t1;
-- when the NOT FOUND condition fires, "done" -- which defaults to FALSE -- will be set to true,
-- and since this is a CONTINUE handler, execution continues with the next statement.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN c1;
my_loop:
LOOP
FETCH NEXT FROM c1 INTO val1;
IF done THEN -- this will be true when we are out of rows to read, so we go to the statement after END LOOP.
LEAVE my_loop;
ELSE
-- maybe do more stuff here
END IF;
END LOOP;
-- procedure continues here...
Copiato in parte dal mio esempio qui .