Инструмент для перевода Oracle PL/SQL в Postgresql PL/pgSQL [закрыто]
-
03-07-2019 - |
Вопрос
Существует ли инструмент (желательно бесплатный), который переведет язык хранимых процедур Oracle PL/SQL на язык хранимых процедур PL/pgSQL Postgresql?
Решение
Существует инструмент, доступный по адресу http://ora2pg.darold.net/ который можно использовать для перевода схем Oracle в схемы Postgres, но я не уверен, что он также переведет хранимые процедуры.Но это может дать отправную точку.
Другие советы
Довольно долго работал над преобразованием Oracle в Postgres.Единственный способ сделать это вручную.Между этими двумя языками есть тонкие различия, которые могут вас сбить с толку.Мы попробовали использовать автоматизированный инструмент, но это только усугубило проблему, и в итоге мы испортили выходные данные.
Есть также EnterpriseDB который имеет достаточную совместимость с Oracle, что облегчает миграцию с Oracle.Версия, совместимая с Oracle, не бесплатна, но на нее стоит обратить внимание, если вы выполняете более одной трансляции процедур.
Используйте ora2pg для перевода вашей схемы.
Для хранимых процедур:
- Вручную преобразуйте все операторы DECODE() в CASE и все внешние соединения Oracle WHERE (+) старого стиля в явные операторы LEFT OUTER JOIN.Я не нашел инструмента для этого.
- Переведите функции 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;