Pregunta

¿Existe una herramienta (preferiblemente gratuita) que traduzca el lenguaje de procedimiento almacenado PL / SQL de Oracle al lenguaje de procedimiento almacenado PL / pgSQL de Postgresql?

¿Fue útil?

Solución

Hay una herramienta disponible en http://ora2pg.darold.net/ que se puede usar para realizar transacciones de esquemas de Oracle a esquemas de Postgres, pero no estoy seguro de si también traducirá los procedimientos almacenados. Pero podría proporcionar un lugar para comenzar.

Otros consejos

Habiendo estado trabajando en una conversión de Oracle a Postgres durante bastante tiempo. La única forma de hacerlo es a mano. Hay diferencias sutiles entre los dos idiomas que pueden hacerte tropezar. Intentamos utilizar una herramienta automatizada, pero solo empeoró el problema y terminamos eliminando el resultado.

También hay EnterpriseDB que tiene bastante compatibilidad con Oracle para ayudar a la migración desde Oracle. La versión con compatibilidad de Oracle no es gratuita, pero vale la pena verla si está realizando más de una traducción de procedimiento.

Usa ora2pg para traducir tu esquema.

Para procedimientos almacenados:

  1. Convierta manualmente todas las declaraciones DECODE () a CASE y todas las uniones externas Oracle WHERE (+) antiguas a declaraciones explícitas LEFT OUTER JOIN. No he encontrado una herramienta para hacer esto.
  2. Traduce funciones PL / SQL en PL / PGSQL (ver más abajo).

Sería muy bueno si alguien comenzara un proyecto de sourceforge para hacer esto.
Sugerencia Sugerencia ...

Esto es lo que quiero decir para (2) arriba:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top