2011-03-27 26 views
7

¿Puede alguien explicarme por qué COMMIT en esta función devuelve EXCEPTION?Commit, savepoint, rollback to in 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;  

y por qué no puedo usar ROLLBACK TO punto de salvaguarda cuando existe bloque de excepción en la función?

Respuesta

8

No puede confirmar en una función/procedimiento almacenado plpgsql usando plpgsql como respondió Frank Heikens. Sin embargo, puede evitar este problema utilizando dblink (http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html) u otro lenguaje de procedimiento de tienda como plperl (no confiable). Echa un vistazo a este enlace donde se habla de esto.

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

El alto nivel es abrir una nueva conexión mediante uno de estos métodos y emitir una transacción separada de esa conexión. Funciona en la mayoría de los casos no es ideal porque está abriendo una nueva conexión, pero puede funcionar bien para la mayoría de los casos de uso.

13

No puede usar COMMIT en un procedimiento almacenado, todo el procedimiento es una transacción propia.

+5

enlace: último párrafo de [esta página] (http://www.postgresql.org/docs/current/static/plpgsql-structure.html#PLPGSQL-STRUCTURE) –

+0

@JackPDouglas: Eso es lo que necesita el OP, anidado bloques. –

+1

en otras palabras, él tiene que 'commit' fuera del procedimiento? Tengo entendido que puede retrotraer subtransacciones dentro del procedimiento, pero no 'commit' en absoluto (o' rollback' toda la transacción explícitamente) –

Cuestiones relacionadas