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

StackOverflow https://stackoverflow.com/questions/158310

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

  1. Вручную преобразуйте все операторы DECODE() в CASE и все внешние соединения Oracle WHERE (+) старого стиля в явные операторы 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top