2013-09-26 140 views
4

我正在将我的数据库服务器从PostgreSQL迁移到Oracle 11g。我尝试了各种工具,如Squirrel SQL。但大多数迁移工具都支持迁移表和视图。我无法找到迁移我的程序和功能的解决方案。我可以如何迁移功能和程序?请找到下面的一个功能。从PostgreSQL到Oracle的数据库迁移

CREATE OR REPLACE FUNCTION hrms.fngetstatus(iactdate character varying, ideactdate character varying) 
    RETURNS character varying AS 
$BODY$ 
    returnval VARCHAR (1); 
BEGIN 
    IF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL 
    THEN 

     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'A'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL 
    THEN 
     returnval := 'A'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') = 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') = 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
     ELSIF  TO_DATE (ideactdate, 'mm/dd/yyyy') >= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (iactdate, 'mm/dd/yyyy') is null      
    THEN 
     returnval := 'A'; 
     ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'A'; 
     ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
      ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D';  
    END IF; 
    RETURN returnval; 
END$BODY$ 
    LANGUAGE edbspl VOLATILE SECURITY DEFINER 
    COST 100; 
ALTER FUNCTION hrms.fngetstatus(character varying, character varying) 
    OWNER TO enterprisedb; 
+3

不同的数据库引擎做不同的事情。例如,oracle没有在其他许多数据库引擎中找到的两种常见日期函数(dateadd,datediff)。我认为做好这件事的唯一方法就是手动完成,以便测试你所做的一切。 –

+0

你可以给我一个文件,我可以阅读清单,记住手动转换它们吗? – Jeyasithar

+0

为什么你不认为重写所有这些。 Oracle支持来自Postgress的不同内置函数 –

回答

3

您需要更改的唯一事情是代码“绕”的功能。 Oracle使用与Postgres不同的“标题”。

所以PL/SQL中的函数看起来像这样。我只改变了最初的CREATE OR REPLACE和部分END

CREATE OR REPLACE FUNCTION fngetstatus(iactdate varchar, ideactdate varchar) 
    RETURN varchar 
AS 
    returnval VARCHAR (1); 
BEGIN 
    IF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL 
    THEN 

     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'A'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') IS NULL 
    THEN 
     returnval := 'A'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
    ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') = 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') = 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
     ELSIF  TO_DATE (ideactdate, 'mm/dd/yyyy') >= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (iactdate, 'mm/dd/yyyy') is null      
    THEN 
     returnval := 'A'; 
     ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'A'; 
     ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') < 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D'; 
      ELSIF  TO_DATE (iactdate, 'mm/dd/yyyy') > 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
     AND TO_DATE (ideactdate, 'mm/dd/yyyy') <= 
         TO_DATE (TO_CHAR (SYSDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') 
    THEN 
     returnval := 'D';  
    END IF; 
    RETURN returnval; 
END; 
/

这里是一个SQLFiddle例如:http://sqlfiddle.com/#!4/94990/2

+0

我试着执行由您更新的查询。获得以下错误:ORA-06550:第7行,第24列: PLS-00103:遇到符号“文件结束”时,会遇到以下某种情况: *&= - +; at in是mod的余数,不是rem <指数(**)><>或!=或= => = <= <>和或类似的像like4 likec between || multiset成员submultiset ' – Jeyasithar

+0

@Jeyasithar然后你没有告诉我们一切。看到我的SQLFiddle它*做*工作。 Squirrel是否支持PL/SQL定义的'/'终止符? –

+0

我在Eclipse中使用数据源资源管理器插件来执行查询。 – Jeyasithar

相关问题