Emi*_*irZ 8 postgresql plpgsql
有人可以向我解释为什么这个函数中的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;
Run Code Online (Sandbox Code Playgroud)
当EXCEPTION块存在于函数中时,为什么我不能使用ROLLBACK TO SavePoint?
Fra*_*ens 13
您不能在存储过程中使用COMMIT,整个过程都是它自己的事务.
正如Frank Heikens回答的那样,你不能使用plpgsql在plpgsql存储的函数/过程中提交.但是,您可以通过DBLINK(解决此问题http://www.postgresql.org/docs/9.0/interactive/contrib-dblink-connect.html)或其他存储过程语言,如plperl(不可信).看看这个谈到的链接.
高级别是您使用这些方法之一打开新连接,并在该连接上发出单独的事务.适用于大多数情况并不理想,因为您正在打开新连接,但在大多数用例中可能正常工作.
| 归档时间: |
|
| 查看次数: |
20532 次 |
| 最近记录: |