2010-02-17 50 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; 

......假設我沒有缺胳膊少腿的邏輯太嚴重;)

我把改變參數的定義方式的自由,和返回類型(因爲它看起來像你實際上並不從函數返回什麼?)

編輯:哎呀,我用select into錯誤的構造......

1

的PostgreSQL在它的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