【问题标题】:Informix to PostgreSQL - Transaction FunctionInformix 到 PostgreSQL - 事务函数
【发布时间】: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


【解决方案1】:

在阅读了您的 cmets 之后,我终于设法解决了这个问题。这是与我在上面发布的 Informix 相同的 PostgreSQL 代码:

CREATE OR REPLACE FUNCTION buyTicket(pFlightId INT, pAmount INT)
RETURNS VOID AS $$
BEGIN
  INSERT INTO transaction(flightId,amount) VALUES (pFlightId, pAmount); 
  UPDATE tickets SET freeSpots = freeSpots - pAmount
  WHERE flightId = pFlightId; 
EXCEPTION
  WHEN others THEN
    IF sqlerrm LIKE '%chkfreespots%' THEN
       RAISE EXCEPTION  'Not enough free spots';
    ELSE
      RAISE;
    END IF;
END;
$$ LANGUAGE plpgsql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多