Инструмент для перевода Oracle PL / SQL в Postgresql PL / pgSQL [закрыто]



Существует ли инструмент (предпочтительно бесплатный), который переведет язык хранимых процедур Oracle PL/SQL в язык хранимых процедур Postgresql?

763   4  

4 ответов:

Есть инструмент, доступный в http://ora2pg.darold.net/ , который может быть использован для преобразования схем Oracle в схемы Postgres, но я не уверен, что он также переведет хранимые процедуры. Но это может послужить отправной точкой.

Работая над преобразованием Oracle в Postgres довольно долгое время. Единственный способ сделать это-вручную. Есть тонкие различия между двумя языками, которые могут сбить вас с толку. Мы попытались использовать автоматизированный инструмент, но это только усугубило проблему, и мы закончили тем, что уничтожили результат.

Есть также EnterpriseDB , который имеет довольно много совместимости Oracle, чтобы помочь миграции из Oracle. Версия с Oracle compatibility не является бесплатной, но стоит посмотреть, если вы делаете больше, чем один перевод процедуры.

Используйте ora2pg для перевода вашей схемы.

Для хранимых процедур:

  1. вручную преобразуйте все операторы DECODE() в CASE и все инструкции Oracle старого типа, где ( + ) внешние соединения в явные операторы LEFT OUTER JOIN. Я не нашел инструмента, чтобы сделать это.
  2. перевести функции PL / SQL в PL / PGSQL (см. ниже).
Было бы очень хорошо, если бы кто-то начал проект 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;

Comments

    Ничего не найдено.