Фиксация, сохранение, откат в PostgreSQL? - PullRequest
8 голосов
/ 27 марта 2011

Может кто-нибудь объяснить мне, почему COMMIT в этой функции возвращает EXCEPTION?

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 TO SavePoint, когда в функции существует блок EXCEPTION?

Ответы [ 2 ]

13 голосов
/ 27 марта 2011

Вы не можете использовать COMMIT в хранимой процедуре, вся процедура является собственной транзакцией.

9 голосов
/ 27 марта 2011

Вы не можете зафиксировать в хранимой функции / процедуре plpgsql, используя plpgsql, как ответил Фрэнк Хейкенс.Однако вы можете обойти эту проблему, используя dblink (http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html) или другой язык процедур хранилища, такой как plperl (ненадежный). Проверьте эту ссылку, где речь шла.

Высокий уровень - это то, что вы открываете новое соединение одним из этих способов и запускаете отдельную транзакцию для этого соединения. В большинстве случаев работает не идеально, потому что вы открываете новое соединение, но может нормально работать в большинстве случаев использования.

...