2010-02-17 7 views
1

Je PORTAGE une fonction Oracle dans Postgres PGPLSQL .. J'utilise ce guide: http://www.postgresql.org/docs/8.1/static/plpgsql.htmlOracle Procédure à Portage 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 ; 

Je l'ai jusqu'ici:

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; 

Cette est l'erreur que je reçois:

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

Je ne sais pas pourquoi cela ne fonctionne pas ... des idées?

Répondre

1

Je ne pense pas que Postgres supporte cette construction de mise à jour (le test simple que j'ai essayé échoue avec la même erreur). Vous pourriez avoir à faire quelque chose comme ceci:

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; 

... en supposant que je ne l'ai pas mutilée la logique trop mal;)

Je pris la liberté de changer la façon dont les paramètres sont définis, et type de retour (car il semble que vous ne fait quoi que ce soit de retour de la fonction?)

Edit: oups, je la mauvaise construction pour select into ...

1

PostgreSQL prend en charge une extension dans sa dE syntaxe UPDATE . Find out more.

donc quelque chose comme ça pourrait fonctionner pour vous ....

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 
Questions connexes