2010-02-17 2 views
1

Я портировании функцию Oracle в Postgres PGPLSQL .. Я использовал это руководство: http://www.postgresql.org/docs/8.1/static/plpgsql.htmlПортирование Процедура Oracle на PostgreSQL

CREATE OR REPLACE PROCEDURE DATA_UPDATE 
    (mission NUMBER, 
    task  NUMBER) 
AS 
BEGIN 
IF mission IS NOT NULL THEN 
    UPDATE MISSION_OBJECTIVE MO 
    SET (MO.MO_TKR_TOTAL_OFF_SCHEDULED, 
      MO.MO_TKR_TOTAL_RECEIVERS) = 
      (SELECT NVL(SUM(RR.TRQ_FUEL_OFFLOAD),0), 
        NVL(SUM(RR.TRQ_NUMBER_RECEIVERS),0) 
       FROM REFUELING_REQUEST RR, MISSION_REQUEST_PAIRING MRP 
      WHERE MO.MSN_INT_ID = MRP.MSN_INT_ID 
       AND MO.MO_INT_ID = MRP.MO_INT_ID 
       AND MRP.REQ_INT_ID = RR.REQ_INT_ID) 
    WHERE MO.MSN_INT_ID = mission 
    AND MO.MO_INT_ID = task ; 
END IF ; 
COMMIT ; 
END ; 

У меня так далеко:

CREATE OR REPLACE FUNCTION DATA_UPDATE 
    (NUMERIC, 
    NUMERIC) 
    RETURNS integer as ' 
    DECLARE 
    mission ALIAS for $1; 
    task ALIAS for $2; 
BEGIN 
IF mission IS NOT NULL THEN 
    UPDATE MISSION_OBJECTIVE MO 
    SET (MO.MO_TKR_TOTAL_OFF_SCHEDULED, 
      MO.MO_TKR_TOTAL_RECEIVERS) = 
      (SELECT COALESCE(SUM(RR.TRQ_FUEL_OFFLOAD),0), 
        COALESCE(SUM(RR.TRQ_NUMBER_RECEIVERS),0) 
       FROM REFUELING_REQUEST RR, MISSION_REQUEST_PAIRING MRP 
      WHERE MO.MSN_INT_ID = MRP.MSN_INT_ID 
       AND MO.MO_INT_ID = MRP.MO_INT_ID 
       AND MRP.REQ_INT_ID = RR.REQ_INT_ID) 
    WHERE MO.MSN_INT_ID = mission 
    AND MO.MO_INT_ID = task ; 
END IF; 
COMMIT; 
END; 
' LANGUAGE plpgsql; 

Этот это ошибка, которую я получаю:

ERROR: syntax error at or near "SELECT" 
LINE 1: ...OTAL_OFF_SCHEDULED, MO.MO_TKR_TOTAL_RECEIVERS) = (SELECT COA... 

Я не знаю, почему это не работает ... любые идеи?

ответ

1

Я не думаю, что Postgres поддерживает эту конструкцию обновления (простой тест, с которым я попытался сбой с той же ошибкой). Вы могли бы сделать что-то вроде этого:

CREATE OR REPLACE FUNCTION DATA_UPDATE 
    (mission NUMERIC, 
    task NUMERIC) 
    RETURNS void as ' 
DECLARE 
    offScheduled int4; 
    totalReceivers int4; 
BEGIN 
IF mission IS NOT NULL THEN 
    select COALESCE(SUM(RR.TRQ_FUEL_OFFLOAD),0), 
    COALESCE(SUM(RR.TRQ_NUMBER_RECEIVERS),0) into offScheduled, totalReceivers 
    FROM REFUELING_REQUEST RR, MISSION_REQUEST_PAIRING MRP 
      WHERE MO.MSN_INT_ID = MRP.MSN_INT_ID 
       AND MO.MO_INT_ID = MRP.MO_INT_ID 
       AND MRP.REQ_INT_ID = RR.REQ_INT_ID; 

UPDATE MISSION_OBJECTIVE MO 
    SET MO.MO_TKR_TOTAL_OFF_SCHEDULED = offScheduled, 
      MO.MO_TKR_TOTAL_RECEIVERS = totalReceivers 
    WHERE MO.MSN_INT_ID = mission 
    AND MO.MO_INT_ID = task ; 
END IF; 
END; 
' LANGUAGE plpgsql; 

... предполагая, я не наломать логику слишком плохо;)

Я взял на себя смелость изменить способ параметры определены, и тип возвращаемого значения (так как он выглядит, как вы на самом деле не возвращаются ничего из функции?)

Edit: упс, я использовал неправильную конструкцию для select into ...

1

PostgreSQL поддерживает расширение FROM в синтаксисе UPDATE , Find out more.

Так что-то подобное может работать для вас ....

UPDATE MISSION_OBJECTIVE MO 
    SET MO.MO_TKR_TOTAL_OFF_SCHEDULED = COALESCE(SUM(RR.TRQ_FUEL_OFFLOAD),0), 
      MO.MO_TKR_TOTAL_RECEIVERS) = COALESCE(SUM(RR.TRQ_NUMBER_RECEIVERS),0) 
       FROM REFUELING_REQUEST RR, MISSION_REQUEST_PAIRING MRP 
      WHERE MRP.MSN_INT_ID = mission 
       AND MRP.MO_INT_ID = task 
       AND MRP.REQ_INT_ID = RR.REQ_INT_ID 
    AND MO.MSN_INT_ID = MRP.MSN_INT_ID 
    AND MO.MO_INT_ID = MRP.MO_INT_ID