Control iterativo

Con las sentencias LOOP, WHILE, FOR y EXIT, puede controlar el flujo de ejecución del programa NZPLSQL de forma iterativa.

Sentencia LOOP

La sentencia LOOP define un bucle incondicional que se repite hasta que lo termina una sentencia EXIT o una sentencia RETURN (que termina el procedimiento y el bucle). Tiene la sintaxis siguiente:
[<<label>>]
LOOP
    statements
END LOOP;

Las sentencias EXIT de bucles anidados pueden utilizar la etiqueta opcional para especificar qué nivel de anidamiento termina.

sentencia EXIT

La sentencia EXIT termina un bucle. Tiene la sintaxis siguiente:
EXIT [ label ] [ WHEN expression ];

Si no especifica una etiqueta, el bucle más interno termina y la sentencia que sigue a END LOOP se ejecuta a continuación. Si especifica una etiqueta, debe ser la etiqueta del nivel actual o de uno superior del bucle anidado o de los bloques. A continuación, el bucle o bloque mencionado termina y el control continúa con la sentencia después del correspondiente END del bucle o bloques.

Ejemplos:
LOOP
-- some computations
IF count > 0 THEN
EXIT; -- exit loop
END IF;
END LOOP;

LOOP
-- some computations
EXIT WHEN count > 0;
END LOOP;

BEGIN
-- some computations
IF stocks > 100000 THEN
EXIT; 
END IF;
END;

Sentencia WHILE

Con la sentencia WHILE, puede realizar bucles en una secuencia de sentencias si la evaluación de la expresión de condición es verdadera.
[<<label>>]
WHILE expression LOOP
statements
END LOOP;
Por ejemplo:
WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
-- some computations here
END LOOP;

WHILE NOT boolean_expression LOOP
-- some computations here
END LOOP;

Sentencia FOR

Utilizando la sentencia FOR, puede crear un bucle que itere en un rango de valores enteros.
[<<label>>]
FOR name IN [ REVERSE ] expression .. expression LOOP
statements
END LOOP;

El nombre de variable se crea automáticamente como tipo entero y existe sólo dentro del bucle. Las dos expresiones para el límite inferior y superior del rango sólo se evalúan cuando se entra en el bucle. El paso de iteración es siempre 1.

Algunos ejemplos de bucles FOR:
FOR i IN 1 .. 10 LOOP
-- some expressions here
RAISE NOTICE 'i is %',i;
END LOOP;

FOR i IN REVERSE 10 .. 1 LOOP
-- some expressions here
END LOOP;