2011-03-27 71 views
7

有人可以向我解釋爲什麼此函數中的COMMIT返回EXCEPTION?提交,保存點,回滾到PostgreSQL?

DECLARE 
    XNar CURSOR (forDATE Varchar) IS 
    SELECT NARUCENO, ISPORUKA_ID FROM XDATA_NARUDZBE 
    WHERE TO_CHAR(XDATA_NARUDZBE.DATUM, 'DD.MM.YYYY') = forDATE; 
LastDate DATE; 
OutResult INTEGER; 
curNAR NUMERIC; 
curISP VARCHAR; 
RXNar  RECORD; 
BEGIN 

OutResult := 1; 

SELECT MAX(DATUM) INTO LastDate FROM XDATA_NARUDZBE; 

FOR RXNar IN XNar(TO_CHAR(LastDate, 'DD.MM.YYYY')) LOOP 

    IF (RXNar.NARUCENO <> 0) AND (RXNar.ISPORUKA_ID = 'R01') THEN 
    UPDATE NARUDZBE SET ISPORUCENO = RXNar.NARUCENO 
     WHERE NARUDZBE.PP_ID = RXNar.PP_ID 
     AND NARUDZBE.ART_ID = RXNar.ART_ID 
     AND NARUDZBE.ISPORUKA_ID = 'R01'; 
    END IF; 

    END LOOP; 

COMMIT; <--- ???? 

RETURN OutResult; 

EXCEPTION 
    WHEN OTHERS THEN 
    OUTRESULT := 0; 
    RAISE;  
    RETURN OutResult; 

END;  

,爲什麼我不能用ROLLBACK當函數存在EXCEPTION塊保存點?

回答

8

Frank Heikens回答說,您不能使用plpgsql提交plpgsql存儲的函數/過程。但是,您可以使用dblink(http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html)或其他存儲過程語言(如plperl(不可信))來解決此問題。看看這個關於這個鏈接的鏈接。

http://postgresql.1045698.n5.nabble.com/Re-GENERAL-Transactions-within-a-function-body-td1992810.html

高水平是你打開使用這些方法中的一個新的連接,併發出一個連接上一個單獨的事務。對於大多數情況下工作不理想,因爲您打開一個新的連接,但可能適用於大多數使用情況。

13

您不能在存儲過程中使用COMMIT,整個過程是它自己的事務。

+5

鏈接:[本頁]的最後一段(http://www.postgresql.org/docs/current/static/plpgsql-structure.html#PLPGSQL-STRUCTURE) – 2011-03-27 12:09:20

+0

@JackPDouglas:這就是OP需要的,嵌套的塊。 – 2011-03-27 12:13:21

+1

換句話說,他需要在程序之外提交?我的理解是,他可以在程序內部回滾子交易,但不會「提交」(或明確地「回滾」整個交易) – 2011-03-27 12:34:23