database - 将 Oracle 过程移植到 PostgreSQL

标签 database oracle postgresql

我正在将一个 Oracle 函数移植到 Postgres 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 into 使用了错误的构造...

关于database - 将 Oracle 过程移植到 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2277731/

相关文章:

database - API 版本控制和存储数据

mysql - 将托管服务器上的网站连接到我的本地主机 php mysql

java - 如何在oracle数据库中插入BigInteger值

c# - 如何将unicode数据保存到oracle?

database - Doctrine - 自己的 postgres 函数

ruby-on-rails - IN 的 Rails 2.3.5 事件记录条件问题

mysql - 这个查询语句怎么用sql写出来呢?

xml - 在导入具有特定 'batchnumber' 标记的 xml 文件之前查询 Oracle 表是否存在 'batchnumber'

postgresql - 为什么 Postgres 使用 "Index Scan Backward"来获取最大 ID?

php - 关键字功能,如 Stackoverflow