2011-03-27 6 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;  

나는 예외 블록 기능에있는 경우 세이브 포인트 롤백을 사용할 수없는 이유는 무엇입니까?

답변

8

Frank Heikens가 대답 한대로 plpgsql을 사용하여 plpgsql 저장 함수/프로 시저를 커밋 할 수 없습니다. 그러나 dblink (http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html) 또는 plperl (untrusted)과 같은 다른 저장 프로 시저 언어를 사용하여이 문제를 해결할 수 있습니다. 이 링크에서이 링크를 확인하십시오.

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) –

+0

@JackPDouglas을 : 즉 OP 필요가 중첩 무엇 블록. –

+1

다른 말로하면 그는 절차 밖에서'커밋 '해야합니까? 내 이해는 그가 프로 시저 내에서 하위 트랜잭션을 롤백 할 수 있지만 전혀 커밋하지는 않습니다 (또는 전체 트랜잭션을 명시 적으로 '롤백'함). –