Re: transactions in functions, possible bug or what I'm doing
От | Michael Fuhr |
---|---|
Тема | Re: transactions in functions, possible bug or what I'm doing |
Дата | |
Msg-id | 20041119162309.GA77593@winnie.fuhr.org обсуждение исходный текст |
Ответ на | Re: transactions in functions, possible bug or what I'm doing (Richard Huxton <dev@archonet.com>) |
Ответы |
Re: transactions in functions, possible bug or what I'm doing
|
Список | pgsql-sql |
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_violationTHEN 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/
В списке pgsql-sql по дате отправления: