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?

Était-ce utile?

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:

  1. 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.
  2. 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top