Index: doc/src/sgml/plpgsql.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/plpgsql.sgml,v retrieving revision 1.83 diff -c -r1.83 plpgsql.sgml *** doc/src/sgml/plpgsql.sgml 29 Dec 2005 04:02:32 -0000 1.83 --- doc/src/sgml/plpgsql.sgml 6 Jan 2006 03:03:11 -0000 *************** *** 3007,3022 **** END IF; ! -- Update the summary row with the new values. ! UPDATE sales_summary_bytime ! SET amount_sold = amount_sold + delta_amount_sold, ! units_sold = units_sold + delta_units_sold, ! amount_cost = amount_cost + delta_amount_cost ! WHERE time_key = delta_time_key; - -- There might have been no row with this time_key (e.g new data!). - IF (NOT FOUND) THEN BEGIN INSERT INTO sales_summary_bytime ( time_key, --- 3007,3023 ---- END IF; ! -- Insert or update the summary row with the new values. ! <<insert_update>> ! LOOP ! UPDATE sales_summary_bytime ! SET amount_sold = amount_sold + delta_amount_sold, ! units_sold = units_sold + delta_units_sold, ! amount_cost = amount_cost + delta_amount_cost ! WHERE time_key = delta_time_key; + EXIT insert_update WHEN found; BEGIN INSERT INTO sales_summary_bytime ( time_key, *************** *** 3029,3048 **** delta_units_sold, delta_amount_cost ); EXCEPTION - -- - -- Catch race condition when two transactions are adding data - -- for a new time_key. - -- WHEN UNIQUE_VIOLATION THEN ! UPDATE sales_summary_bytime ! SET amount_sold = amount_sold + delta_amount_sold, ! units_sold = units_sold + delta_units_sold, ! amount_cost = amount_cost + delta_amount_cost ! WHERE time_key = delta_time_key; ! END; ! END IF; RETURN NULL; END; --- 3030,3044 ---- delta_units_sold, delta_amount_cost ); + + EXIT insert_update; + EXCEPTION WHEN UNIQUE_VIOLATION THEN ! -- do nothing END; ! END LOOP insert_update; ! RETURN NULL; END; *************** *** 3051,3056 **** --- 3047,3062 ---- CREATE TRIGGER maint_sales_summary_bytime AFTER INSERT OR UPDATE OR DELETE ON sales_fact FOR EACH ROW EXECUTE PROCEDURE maint_sales_summary_bytime(); + + INSERT INTO sales_fact VALUES(1,1,1,10,3,15); + INSERT INTO sales_fact VALUES(1,2,1,20,5,35); + INSERT INTO sales_fact VALUES(2,2,1,40,15,135); + INSERT INTO sales_fact VALUES(2,3,1,10,1,13); + SELECT * FROM sales_summary_bytime; + DELETE FROM sales_fact WHERE product_key = 1; + SELECT * FROM sales_summary_bytime; + UPDATE sales_fact SET units_sold = units_sold * 2; + SELECT * FROM sales_summary_bytime;