Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中提交、保存点、回滚到?_Postgresql_Plpgsql - Fatal编程技术网

在PostgreSQL中提交、保存点、回滚到?

在PostgreSQL中提交、保存点、回滚到?,postgresql,plpgsql,Postgresql,Plpgsql,有人能给我解释一下为什么这个函数中的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; c

有人能给我解释一下为什么这个函数中的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;    
声明
XNar游标(forDATE Varchar)为
从XDATA_NARUDZBE中选择NARUCENO,ISPORUKA_ID
WHERE TO_CHAR(XDATA_NARUDZBE.DATUM,'DD.MM.YYYY')=forDATE;
最后日期;
输出结果整数;
curNAR数字;
库里斯帕·瓦尔查尔;
RXNar记录;
开始
结果:=1;
从XDATA_NARUDZBE中选择MAX(基准)到LastDate;
对于XNar(TO_CHAR(LastDate,'DD.MM.YYYY'))循环中的RXNar
如果(RXNar.NARUCENO 0)和(RXNar.ISPORUKA_ID='R01'),则
更新NARUDZBE集ISPORUCENO=RXNar.NARUCENO
其中NARUDZBE.PP_ID=RXNar.PP_ID
和NARUDZBE.ART_ID=RXNar.ART_ID
和NARUDZBE.ISPORUKA_ID='R01';
如果结束;
端环;

承诺 不能在存储过程中使用COMMIT,整个过程是它自己的事务。

正如Frank Heikens回答的那样,不能在使用plpgsql的plpgsql存储函数/过程中进行提交。但是,您可以使用dblink()或其他存储过程语言(如plperl(不受信任))来解决此问题。请查看此链接


高级别是使用这些方法之一打开一个新连接,并在该连接上发出一个单独的事务。适用于大多数情况并不理想,因为您正在打开一个新连接,但可能适用于大多数用例。

链接:@JackPDouglas的最后一段:这就是OP需要的,嵌套块。换句话说,他需要
提交过程之外的
?我的理解是,他可以回滚过程中的子事务,但根本不能
commit
(或者
rollback
显式回滚整个事务)我对PG是新手。。。谢谢你为我澄清!下一个问题呢?