Simple Loop:
DECLARE
l_counter NUMBER := 0;
l_sum NUMBER := 0;
BEGIN
LOOP
l_sum := l_sum + l_counter;
l_counter := l_counter + 1;
EXIT WHEN l_counter > 3;
END LOOP;
END;
Exit Conditions:
EXIT/RETURN:
DECLARE
l_counter NUMBER := 0;
l_sum NUMBER := 0;
BEGIN
LOOP
l_sum := l_sum + l_counter;
l_counter := l_counter + 1;
IF l_counter > 3 THEN
EXIT; -- Could use RETURN keyword instead
END IF;
END LOOP;
END;
CONTINUE WHEN:
BEGIN
<<outer>>
FOR l_outer_counter IN 1..3 LOOP
dbms_output.PUT_LINE('l_outer_counter: ' || l_outer_counter);
<<inner>>
FOR l_inner_counter IN 1..3 LOOP
CONTINUE outer WHEN l_inner_counter = 2;
dbms_output.PUT_LINE(' l_inner_counter: ' || l_inner_counter);
END LOOP inner;
dbms_output.PUT_LINE('l_outer_counter at end: ' || l_outer_counter); -- never printed
END LOOP outer;
END;
GOTO:
DECLARE
l_counter NUMBER := 0;
l_sum NUMBER := 0;
BEGIN
LOOP
l_sum := l_sum + l_counter;
l_counter := l_counter + 1;
IF l_counter > 3 THEN
GOTO out_of_loop;
END IF;
END LOOP;
<<out_of_loop>> -- This is a label
null; -- Must have at least one line after label
END;
GOTO cannot jump to conditionals or nested blocks or loops. However, it can jump to outer blocks. Avoid GOTO if possible.