G-4370: Avoid using EXIT to stop loop processing unless you are in a basic loop.
Major
Maintainability
Reason
A numeric for loop as well as a while loop and a cursor for loop have defined loop boundaries. If you are not able to exit your loop using those loop boundaries, then a basic loop is the right loop to choose.
Example (bad)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | declare i integer; k_min_value constant simple_integer := 1; k_max_value constant simple_integer := 10; k_increment constant simple_integer := 1; begin i := k_min_value; <<while_loop>> while (i <= k_max_value) loop i := i + k_increment; exit while_loop when i > k_max_value; end loop while_loop; <<basic_loop>> loop exit basic_loop; end loop basic_loop; <<for_loop>> for i in k_min_value..k_max_value loop null; exit for_loop when i = k_max_value; end loop for_loop; <<process_employees>> for r_employee in (select last_name from employee) loop sys.dbms_output.put_line(r_employee.last_name); null; -- some processing exit process_employees; end loop process_employees; end; / |
Example (good)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | declare i integer; k_min_value constant simple_integer := 1; k_max_value constant simple_integer := 10; k_increment constant simple_integer := 1; begin i := k_min_value; <<while_loop>> while (i <= k_max_value) loop i := i + k_increment; end loop while_loop; <<basic_loop>> loop exit basic_loop; end loop basic_loop; <<for_loop>> for i in k_min_value..k_max_value loop sys.dbms_output.put_line(i); end loop for_loop; <<process_employees>> for r_employee in (select last_name from employee) loop sys.dbms_output.put_line(r_employee.last_name); -- some processing end loop process_employees; end; / |