G-1020: Always have a matching loop or block label.

Minor

Maintainability

Reason

Use a label directly in front of loops and nested anonymous blocks:

  • To give a name to that portion of code and thereby self-document what it is doing.
  • So that you can repeat that name with the END statement of that block or loop.

Example (bad)

DECLARE
   i INTEGER;
   co_min_value CONSTANT INTEGER := 1;
   co_max_value CONSTANT INTEGER := 10;
   co_increment CONSTANT INTEGER := 1;
BEGIN
   <<prepare_data>>
   BEGIN 
      NULL;
   END;

   <<process_data>>
   BEGIN
      NULL;
   END;

   i := co_min_value;
   <<while_loop>>
   WHILE (i <= co_max_value) 
   LOOP 
      i := i + co_increment; 
   END LOOP;

   <<basic_loop>>
   LOOP 
      EXIT basic_loop;
   END LOOP;

   <<for_loop>>
   FOR i IN co_min_value..co_max_value
   LOOP 
      sys.dbms_output.put_line(i);
   END LOOP;
END;
/

Example (good)

DECLARE
   i INTEGER;
   co_min_value CONSTANT INTEGER := 1;
   co_max_value CONSTANT INTEGER := 10;
   co_increment CONSTANT INTEGER := 1;
BEGIN
   <<prepare_data>>
   BEGIN 
      NULL;
   END prepare_data;

   <<process_data>>
   BEGIN
      NULL;
   END process_data;

   i := co_min_value;
   <<while_loop>>
   WHILE (i <= co_max_value) 
   LOOP 
      i := i + co_increment; 
   END LOOP while_loop;

   <<basic_loop>>
   LOOP 
      EXIT basic_loop;
   END LOOP basic_loop;

   <<for_loop>>
   FOR i IN co_min_value..co_max_value
   LOOP 
     sys.dbms_output.put_line(i);
   END LOOP for_loop;
END;
/