Портирование процедуры Oracle к PostgreSQL

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

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
задан Gabe 27 March 2010 в 20:16
поделиться

2 ответа

Я не думаю, что 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;

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

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

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

1
ответ дан 3 September 2019 в 01:12
поделиться

PostgreSQL поддерживает расширение FROM в синтаксисе UPDATE. Подробнее .

Что-то вроде этого могло бы сработать для вас ....

  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
1
ответ дан 3 September 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: