2013-05-22 31 views
2

是否可以取消用户定义功能中的先前操作?取消用户定义功能中的先前操作

例如:

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

     UPDATE table1 SET ... 

     UPDATE table2 SET ... 

     IF some_condition THEN 
      --Here is possible to cancel all above operations? 
      RETURN FALSE; 
     END IF; 

     RETURN TRUE; 
    END; 
$$ 
LANGUAGE plpgsql; 
+0

mmm ...可能EXCEPTION会有帮助吗? – RIKI

回答

3

两个答案至今是不正确的。
如果尝试启动交易或使用SAVEPOINT一个PLPGSQL函数中你会得到这样的错误信息:如果您尝试SAVEPOINT一个普通的SQL函数内部

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 

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

由于错误消息指示,请使用BEGIN block代之以一个plpgsql函数。你的演示可能是这样的:

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展示了一切。

+0

非常感谢您的完美回答 – RIKI