Outil de traduction d'Oracle PL / SQL en Postgresql PL / pgSQL [fermé]
-
03-07-2019 - |
Question
Existe-t-il un outil (de préférence gratuit) qui traduira le langage de procédures stockées PL / SQL d’Oracle en langage de procédures stockées PL / pgSQL de Postgresql?
La solution
Un outil est disponible sur http://ora2pg.darold.net/ . pour traduire les schémas Oracle en schémas Postgres, mais je ne sais pas s'il traduira également les procédures stockées. Mais cela pourrait constituer un point de départ.
Autres conseils
Avoir travaillé sur une conversion Oracle en Postgres pendant un certain temps. La seule façon de le faire est à la main. Il existe des différences subtiles entre les deux langues qui peuvent vous faire trébucher. Nous avons essayé d'utiliser un outil automatisé, mais cela n'a fait qu'aggraver le problème et nous avons fini par détruire la sortie.
Il existe également un EnterpriseDB , qui offre une bonne compatibilité avec Oracle pour faciliter la migration à partir d'Oracle. La version compatible avec Oracle n’est pas gratuite, mais vaut la peine d’être examinée si vous traduisez plus d’une traduction de procédure.
Utilisez ora2pg pour traduire votre schéma.
Pour les procédures stockées:
- Convertissez manuellement toutes les instructions DECODE () en instructions CASE et toutes les jointures externes WHERE (+) à l'ancien style en instructions LEFT OUTER JOIN explicites. Je n'ai pas trouvé d'outil pour le faire.
- Traduisez les fonctions PL / SQL dans PL / PGSQL (voir ci-dessous).
Ce serait très bien si quelqu'un commençait un projet sourceforge pour le faire.
Indice indice ...
Voici ce que je veux dire pour (2) ci-dessus:
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;