Expert

Q:

2-22.

The first two rewrites (a and b) have just one way out, but they do not accurately reflect the processing that took place in the original. What if years_in is 3? Rewrite (d) correctly stops the loop from continuing if yearnum exceeds the value of years_in, but it still has two ways out (with the addition of the EXIT WHEN statement). Rewrite (c) is the only one that is both logically equivalent and well-structured (one way in, one way out).

Q:

2-23.

It executes an infinite number of times; this is an infinite WHILE loop. The local module called inside the loop never returns NULL for step_out, so next_analysis_step is never NULL. The analysis_cursor%NOTFOUND attribute returns TRUE, but no exception is raised even though you are fetching past the end of the result set. Thus, the loop never terminates.

Q:

2-24.

At first glance, you might think it best to use the numeric FOR loop, as shown here:

PACKAGE BODY company_pkg
IS
   TYPE ids_tabtype IS TABLE OF INTEGER
      INDEX BY BINARY_INTEGER;

   PROCEDURE close_all (company_ids IN ids_tabtype) IS
   BEGIN
      FOR id_ind IN company_ids.FIRST .. company_ids.LAST
      LOOP
         UPDATE company SET status = 'C'
          WHERE company_id = company_ids(id_ind);
      END LOOP;
   END;
END;

The problem with this code is that it assumes the company_ids table is filled from first to last row. But the row numbers are company ID numbers, and there is a good chance they are not sequentially defined (at least those companies slotted to be closed).

Consequently, you are always better off using ...

Get Oracle PL/SQL Programming: A Developer's Workbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.