Commit, savepoint, откат в PostgreSQL?
может кто-нибудь объяснить мне, почему COMMIT в этой функции возвращает исключение ?
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;
и почему я не могу использовать откат для сохранения точки, когда блок исключений существует в функции?
2 ответов
вы не можете зафиксировать в хранимой функции/процедуре plpgsql, используя plpgsql, как ответил Фрэнк Хейкенс. Однако вы можете обойти эту проблему, используя dblink (http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html) или другой язык процедур хранения, например plperl(ненадежный). Проверьте эту ссылку, где это говорили о.
высокий уровень вы открываете новое соединение, используя один из этих методов и издать отдельной транзакции на связи. Работает для большинства случаев не подходит, потому что вы открываете новое соединение, но может работать нормально в большинстве случаев.
вы не можете использовать COMMIT в хранимой процедуре, вся процедура является собственной транзакцией.