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 ... |