用于将Oracle PL / SQL转换为Postgresql PL / pgSQL的工具

时间:2020-03-06 14:58:57  来源:igfitidea点击:

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

解决方案

http://ora2pg.darold.net/有一个可用的工具,可用于将Oracle架构转换为Postgres架构,但是我不确定它是否还会转换存储过程。
但这可能是一个起点。

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

从事Oracle到Postgres转换已经有一段时间了。唯一的方法是手工。两种语言之间有细微的差别,可能会使我们感到困惑。我们尝试使用自动化工具,但这只会使问题变得更糟,最终浪费了输出。

使用ora2pg转换架构。

对于存储过程:

  • 手动将所有DECODE()转换为CASE语句,并将所有旧式的Oracle WHERE(+)外连接转换为显式的LEFT OUTER JOIN语句。我还没有找到执行此操作的工具。
  • 在PL / PGSQL中转换PL / SQL函数(请参见下文)。

如果有人启动了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;