【发布时间】:2015-05-24 09:10:40
【问题描述】:
我需要将我的 Informix 函数转换为 PostgreSQL。问题是我知道 PostgreSQL 不允许在函数中调用 BEGIN WORK 和 COMMIT,所以我不知道如何处理我的异常并以这种方式回滚。
我要转换的函数如下所示:
CREATE PROCEDURE buyTicket(pFlightId LIKE transaction.flightId, pAmount LIKE transaction.amount)
DEFINE sqle, isame INTEGER;
DEFINE errdata CHAR(80);
ON EXCEPTION SET sqle, isame, errdata
ROLLBACK WORK;
IF sqle = -530 AND errdata LIKE '%chkfreespots%' THEN
RAISE EXCEPTION -746, 0, 'Not enough free spots';
ELSE
RAISE EXCEPTION sqle, isame, errdata;
END IF
END EXCEPTION;
BEGIN WORK;
INSERT INTO transaction VALUES (0, pFlightId, pAmount);
UPDATE tickets SET freeSpots= freeSpots - pAmount
WHERE flightId = pFlightId;
COMMIT WORK;
END PROCEDURE;
【问题讨论】:
-
你能发布你想要转换为函数的初始查询吗?谁告诉你不能处理函数内部的事务?
-
查看this answer 作为函数内部事务的起点。
-
我想转换这 2 个查询(INSERT 和 UPDATE),在 SQL 中有完整的函数,我想转换为 PostgreSQL。当我想在函数内部的 PostgreSQL 中执行 BEGIN WORK 时,我得到一个错误,你不能在函数内部使用它。
-
在 PostgreSQL 的函数中不需要 BEGIN WORK 或 COMMIT WORK,函数总是在事务中运行。只需使用适当的 plpgsql 进行异常处理,参见手册,就可以了。
标签: sql postgresql transactions plpgsql informix