8

是否有工具(最好是免费的)可以将 Oracle 的 PL/SQL 存储过程语言翻译成 Postgresql 的 PL/pgSQL 存储过程语言?

4

4 回答 4

6

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

于 2008-10-01T15:58:36.717 回答
5

还有EnterpriseDB,它具有相当多的 Oracle 兼容性,以帮助从 Oracle 迁移。与 Oracle 兼容的版本不是免费的,但如果您要做的不仅仅是一个程序翻译,那么值得一看。

于 2008-10-01T16:07:45.963 回答
5

很长一段时间以来一直致力于 Oracle 到 Postgres 的转换。唯一的方法是手工。两种语言之间存在细微的差异,可能会让您大吃一惊。我们尝试使用自动化工具,但它只会让问题变得更糟,我们最终破坏了输出。

于 2010-10-25T16:43:19.680 回答
2

使用 ora2pg 转换您的架构。

对于存储过程:

  1. 手动将所有 DECODE() 转换为 CASE 语句,并将所有旧式 Oracle WHERE (+) 外部联接转换为显式 LEFT OUTER JOIN 语句。我还没有找到执行此操作的工具。
  2. 在 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;
于 2010-10-27T21:06:42.207 回答