Re: Does RAISE EXCEPTION rollback previous commands in a stored function?

From: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
To: "'Alexander Farber *EXTERN*'" <alexander(dot)farber(at)gmail(dot)com>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>
Subject: Re: Does RAISE EXCEPTION rollback previous commands in a stored function?
Date: 2016-03-02 11:35:54
Message-ID: A737B7A37273E048B164557ADEF4A58B53805B37@ntex2010i.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Alexander Farber wrote:
> On Wed, Mar 2, 2016 at 11:18 AM, Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at> wrote:
>> You cannot use START TRANSACTION, BEGIN, SAVEPOINT, COMMIT or ROLLBACK
>> inside a function. A function always runs within one transaction.
>>
>> Savepoints or subtransactions are written with a BEGIN ... EXCEPTION
>> block in PL/pgSQL, so you could write:
>>
>> DECLARE FUNCTION .... AS
>> $$BEGIN
>> /* UPDATE 1 */
>> UPDATE ...;
>> BEGIN /* sets a savepoint */
>> /* UPDATE 2, can cause an error */
>> UPDATE ...;
>> EXCEPTION
>> /* rollback to savepoint, ignore error */
>> WHEN OTHERS THEN NULL;
>> END;
>> END;$$;
>>
>> Even if UPDATE 2 throws an error, UPDATE 1 will be committed.

> Thank you, this is very helpful, just 1 little question:
>
>
> Why do you write just EXCEPTION?
>
>
> Shouldn't it be RAISE EXCEPTION?

That's something entirely different, see
http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

The above construct *catches* the exception, which might be
raised by the UPDATE statement.

Yours,
Laurenz Albe

In response to

Browse pgsql-general by date

  From Date Subject
Next Message fredrik 2016-03-02 11:54:38 "missing chunk number XX for toast value YY in pg_toast ..." after pg_basebackup.
Previous Message Alexander Farber 2016-03-02 10:59:46 Re: Does RAISE EXCEPTION rollback previous commands in a stored function?