2013-05-22 34 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