Cancel previous operations in user defined function

前端 未结 1 1755
花落未央
花落未央 2021-01-22 16:03

Is it possible to cancel previous operations in a user defined function?

For example:

CREATE OR REPLACE FUNCTION transact_test () RETURNS BOOLEAN
AS $$
          


        
相关标签:
1条回答
  • 2021-01-22 16:19

    Both answers so far are incorrect.
    If you try to start a transaction or use a SAVEPOINT inside a plpgsql function you get an error message like this:

    ERROR:  cannot begin/end transactions in PL/pgSQL
    HINT:  Use a BEGIN block with an EXCEPTION clause instead.
    CONTEXT:  PL/pgSQL function "f_savepoint" line 6 at SQL statement
    

    If you try a SAVEPOINT inside a plain SQL function:

    ERROR:  SAVEPOINT is not allowed in a SQL function
    CONTEXT:  SQL function "f_savepoint2" during startup
    

    As the error message instructs, use a BEGIN block inside a plpgsql function instead. Your demo could look like this:

    CREATE OR REPLACE FUNCTION transact_test(boolean)
      RETURNS boolean AS
    $func$
    BEGIN -- start a nested BEGIN block
        UPDATE t SET i = i+1 WHERE i = 1;
        UPDATE t SET i = i+1 WHERE i = 3;
        IF $1 THEN
            RAISE EXCEPTION 'foo';  -- cancels all of the above
        END IF;
    
        RETURN TRUE;
    
    EXCEPTION WHEN OTHERS THEN
        RETURN FALSE; 
        -- do nothing
    END
    $func$ LANGUAGE plpgsql;
    

    -> SQLfiddle demonstrating it all.

    0 讨论(0)
提交回复
热议问题