4 ответов:
Есть инструмент, доступный в http://ora2pg.darold.net/ , который может быть использован для преобразования схем Oracle в схемы Postgres, но я не уверен, что он также переведет хранимые процедуры. Но это может послужить отправной точкой.
Работая над преобразованием Oracle в Postgres довольно долгое время. Единственный способ сделать это-вручную. Есть тонкие различия между двумя языками, которые могут сбить вас с толку. Мы попытались использовать автоматизированный инструмент, но это только усугубило проблему, и мы закончили тем, что уничтожили результат.
Есть также EnterpriseDB , который имеет довольно много совместимости Oracle, чтобы помочь миграции из Oracle. Версия с Oracle compatibility не является бесплатной, но стоит посмотреть, если вы делаете больше, чем один перевод процедуры.
Используйте ora2pg для перевода вашей схемы.
Для хранимых процедур:
Было бы очень хорошо, если бы кто-то начал проект sourceforge, чтобы сделать это.
- вручную преобразуйте все операторы DECODE() в CASE и все инструкции Oracle старого типа, где ( + ) внешние соединения в явные операторы LEFT OUTER JOIN. Я не нашел инструмента, чтобы сделать это.
- перевести функции PL / SQL в PL / PGSQL (см. ниже).
Намек, намек...Вот что я имею в виду для (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