是否有工具(最好是免费的)将Oracle的PL / SQL存储过程语言转换为Postgresql的PL / pgSQL存储过程语言?

有帮助吗?

解决方案

http://ora2pg.darold.net/ 上有一个工具可供使用将Oracle Schema转换为Postgres模式,但我不确定它是否也会转换存储过程。 但它可能提供一个起点。

其他提示

在相当一段时间内一直致力于Oracle到Postgres的转换。唯一的方法是手工完成。这两种语言之间存在微妙的差异,可能会让您失望。我们尝试使用自动化工具,但它只会使问题变得更糟,我们最终破坏了输出。

还有 EnterpriseDB ,它具有相当多的Oracle兼容性,可帮助从Oracle迁移。具有Oracle兼容性的版本不是免费的,但如果您只做一个以上的过程转换,那么值得一看。

使用ora2pg翻译您的架构。

对于存储过程:

  1. 将所有DECODE()手动转换为CASE语句,将所有旧式Oracle WHERE(+)外连接手动转换为显式LEFT OUTER JOIN语句。我还没有找到这样做的工具。
  2. 翻译PL / PGSQL中的PL / SQL函数(见下文)。
  3. 如果有人启动了sourceforge项目,那将是非常好的。
    暗示提示......

    以上是我对上述(2)的意思:

    CREATE OR REPLACE FUNCTION trunc(
      parmDate   DATE    ,
      parmFormat VARCHAR ) 
    RETURNS date 
    AS $
    DECLARE
      varPlSqlFormat VARCHAR;
      varPgSqlFormat VARCHAR;
    BEGIN
      varPgSqlFormat := lower(parmFormat);
    
      IF varPgSqlFormat IN (
        'syyyy' ,
        'yyyy'  ,
        'year'  ,
        'syear' ,
        'yyy'   ,
        'yy'    ,
        'y'     ) THEN
        varPgSqlFormat := 'year';
      ELSEIF varPgSqlFormat IN (
        'month' ,
        'mon'   ,
        'mm'    ,
        'rm'    ) THEN 
        varPgSqlFormat := 'month';
      ELSEIF varPgSqlFormat IN (
        'ddd' ,
        'dd'  ,
        'j'   ) THEN 
        varPgSqlFormat := 'day';
      END IF;
    
      RETURN DATE_TRUNC(varPgSqlFormat,parmDate);
    END;
    $ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION trunc(
      parmDate   DATE) 
    RETURNS date 
    AS $
    DECLARE
    BEGIN
      RETURN DATE_TRUNC('day',parmDate);
    END;
    $ LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION last_day(in_date date) RETURNS date 
    AS $
    DECLARE
    BEGIN
      RETURN CAST(DATE_TRUNC('month', in_date) + '1 month'::INTERVAL AS DATE) - 1;
    END;
    $ LANGUAGE plpgsql;
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top