On Fri, Nov 19, 2004 at 12:59:07PM +0000, Richard Huxton wrote: > You can have what are called "savepoints" in version 8.0 though, which > lets you trap errors and rollback to a named (saved) point in your function.
Savepoints in functions don't work as of 8.0.0beta4, unless I'm doing something wrong: CREATE TABLE foo (id SERIAL PRIMARY KEY, name TEXT NOT NULL); CREATE FUNCTION fooins(TEXT) RETURNS BOOLEAN AS $$ BEGIN SAVEPOINT x; INSERT INTO foo (name) VALUES ($1); ROLLBACK TO x; RETURN TRUE; END; $$ LANGUAGE plpgsql; BEGIN; SELECT fooins('John'); ERROR: SPI_execute_plan failed executing query "SAVEPOINT x": SPI_ERROR_TRANSACTION CONTEXT: PL/pgSQL function "fooins" line 2 at SQL statement Error trapping does work, however: CREATE FUNCTION fooins(TEXT) RETURNS BOOLEAN AS $$ BEGIN INSERT INTO foo (name) VALUES ($1 || '-1'); BEGIN INSERT INTO foo (id, name) VALUES (currval('foo_id_seq'), $1 || '-2'); EXCEPTION WHEN unique_violation THEN NULL; END; INSERT INTO foo (name) VALUES ($1 || '-3'); RETURN TRUE; END; $$ LANGUAGE plpgsql; SELECT fooins('John'); fooins -------- t (1 row) SELECT * FROM foo; id | name ----+-------- 1 | John-1 2 | John-3 (2 rows) -- Michael Fuhr http://www.fuhr.org/~mfuhr/ ---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match