Oracle PL/SQL Programming, 3rd Edition by Bill Pribyl, Steven Feuerstein The following corrections were made to the 2/03 reprint: Here's a key to the markup: [page-number]: serious technical mistake {page-number}: minor technical mistake : important language/formatting problem (page-number): language change or minor formatting problem [15] IN PRINT: first line of the first example; CREATE TYPE empnos_list_t IS VARRARY(100) OF NUMBER; NOW READS: CREATE TYPE empnos_list_t IS VARRAY(100) OF NUMBER; [15] both examples; CREATE OR REPLACE del_emps NOW READS: CREATE OR REPLACE PROCEDURE del_emps [15] IN PRINT: del_emps procedure; FORALL listnum IN list_in.FIRST .. list_in.LAST LOOP DELETE FROM ... NOW READS: FORALL listnum IN list_in.FIRST .. list_in.LAST DELETE FROM ... (40) IN PRINT: Half way down; SQL SET AUTOMCOMMIT OFF NOW READS: SQL SET AUTOCOMMIT OFF {74} Last line above footnote; "SQL> SELECT * FROM V$RESERVED_WORD;" NOW READS: "SQL> SELECT * FROM V$RESERVED_WORDS;" pg 89 IN PRINT: 89, top "provides a way to handle multiple, mutually exclusive alternatives. The general format for this variation of the IF statement is:" NOW READS: "provides a way to handle multiple conditions within a single IF statement. In general, you should use ELSIF with mutually exclusive alternatives (ie only one condition can be TRUE for any execution of the IF statement). The general format for this variation of IF is:" {109} IN PRINT: 5th row from the bottom; Rows 4 and 5 from the bottom: WHILE ranking_level <= max_rank_in LOO NOW READ: WHILE ranking_level <= max_rank_in LOOP (199) IN PRINT: 2nd last para in CONCAT; "...CONCAT(CONCAT('abc','def'),'efg') NOW READS: "...CONCAT(CONCAT('abc','def'),'ghi') (224) IN PRINT: 1st paragraph; "...the word "ijzen" (Dutch for "iron")..." NOW READS: "...the word "ijzer" (Dutch for "iron")..." (264) IN PRINT: Bottom - expiration_date function; CREATE TABLE good_for NOW READS: CREATE TABLE shelf_life [280] IN PRINT: 4th paragraph; "With RR you can enter dates from the 21st century before the year 2000, and dates from the 20th century (like the birthdays of employees and customers) after the year 2000." This sentences HAS BEEN DELETED. pg 339 IN PRINT: 3rd paragraph, 1st line: "...theoretical limits on an associative array..." NOW READS: "...theoretical limits on an associative array indexed by BINARY_INTEGER..." pg 341 IN PRINT: 3rd section, TYPE example: INDEX BY [ BINARY_INTEGER | VARCHAR2(size_limit)] NOW READS: INDEX BY [ BINARY_INTEGER | subtype of BINARY_INTEGER | VARCHAR2(size_limit)] pg 352. Specifications for DELETE method have replaced PLS_INTEGER references to: [BINARY_INTEGER | VARCHAR2(size_limit)] NOW READS: PROCEDURE DELETE (i [BINARY_INTEGER | VARCHAR2(size_limit)]; PROCEDURE DELETE (i [BINARY_INTEGER | VARCHAR2(size_limit)], j [BINARY_INTEGER | VARCHAR2(size_limit)]); pg 353 Specifications for EXIST header have replaced PLS_INTEGER references to: [BINARY_INTEGER | VARCHAR2(size_limit)] NOW READS: FUNCTION EXISTS (i IN [BINARY_INTEGER | VARCHAR2(size_limit)]) RETURN BOOLEAN; pg 356 - Specifications for PRIOR and NEXT headers have replaced PLS_INTEGER references to: [BINARY_INTEGER | VARCHAR2(size_limit)] NOW READS: FUNCTION PRIOR (i [BINARY_INTEGER | VARCHAR2(size_limit)]) RETURN [BINARY_INTEGER | VARCHAR2(size_limit)]; FUNCTION NEXT (i [BINARY_INTEGER | VARCHAR2(size_limit)]) RETURN [BINARY_INTEGER | VARCHAR2(size_limit)]; [469] Last Line; DECLARE PROCEDURE showcount (str VARCHAR2) IS num integer; BEGIN SELECT COUNT(*) INTO num FROM emp2; NOW READS: DECLARE PROCEDURE showcount (str VARCHAR2) IS num integer; BEGIN SELECT COUNT(*) INTO num FROM tasks;' {493} IN PRINT: jealousy_level package; Line 25... CLOSE emptyp_cur; NOW READS: CLOSE jealousy_cur; {599} IN PRINT: Example at top of page; "PROCEDURE value_ok (number_in IN NUMBER) RETURN BOOLEAN" NOW READS: "PROCEDURE value_ok (number_in IN NUMBER)" (709) IN PRINT: Last line; INVALID_STATE NOW READS: INVALID_TRIGGER