2015-05-24 72 views
1

我需要將我的Informix函數轉換爲PostgreSQL。問題是我知道PostgreSQL不允許在函數中調用BEGIN WORK和COMMIT,所以我不知道如何處理我的異常並以這種方式回滾。Informix到PostgreSQL - 交易功能

功能,我想轉換看起來像這樣:

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; 
+0

你可以發佈你的,你婉轉換爲function.And誰告訴你,你不能處理內部函數交易初始查詢? – Houari

+0

看看[這個答案](http://stackoverflow.com/a/24523639/1216680)作爲關於函數內部交易的起點。 – Houari

+0

我想轉換這2個查詢(INSERT和UPDATE),在SQL中我想要轉換爲PostgreSQL的功能齊全。當我想在函數內執行PostgreSQL中的BEGIN WORK時,我得到一個錯誤,你不能在函數內部使用它。 – TranceFusion

回答

1

通過您的意見看完後我終於設法解決這個問題之一。這是因爲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;