2015-05-24 3 views
1

Мне нужно преобразовать мою функцию Informix в PostgreSQL. Проблема в том, что я знаю, что PostgreSQL не позволяет вызывать функцию BEGIN WORK и COMMIT, поэтому я не знаю, как обращаться с моими исключениями и откатом таким образом.Informix to 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. Когда я хочу выполнить BEGIN WORK в PostgreSQL внутри функции, я получаю сообщение об ошибке, которое вы не можете использовать внутри функции. – TranceFusion

ответ

1

После прочтения ваших комментариев я наконец-то удалось исправить это. Вот код PostgreSQL, который работает так же, как Informix, которую я написал выше:

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; 
Смежные вопросы