Database 将Oracle过程移植到PostgreSQL

Database 将Oracle过程移植到PostgreSQL,database,oracle,postgresql,Database,Oracle,Postgresql,我正在将Oracle函数移植到Postgres PGPLSQL中。。我一直在使用本指南: 我已经做到了这一点: 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 MISSIO

我正在将Oracle函数移植到Postgres PGPLSQL中。。我一直在使用本指南:

我已经做到了这一点:

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-into
..

使用了错误的构造。PostgreSQL在其更新语法中支持FROM扩展

所以像这样的东西可以为你工作

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