Herramienta para la traducción de Oracle PL / SQL a Postgresql PL / pgSQL [cerrado]
-
03-07-2019 - |
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?
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:
- 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.
- 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;