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.

results matching ""

    No results matching ""