Я портирую функцию 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...
Я не знаю, почему это не работает... никакие идеи?
Я не думаю, что 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 в
...
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