在PostgreSQL中提交、保存点、回滚到?
有人能给我解释一下为什么这个函数中的COMMIT返回异常吗在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
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是新手。。。谢谢你为我澄清!下一个问题呢?