Strumento per la traduzione di Oracle PL / SQL in Postgresql PL / pgSQL [chiuso]
-
03-07-2019 - |
Domanda
Esiste uno strumento (preferibilmente gratuito) che tradurrà il linguaggio delle procedure memorizzate PL / SQL di Oracle nel linguaggio delle procedure memorizzate PL / pgSQL di Postgresql?
Soluzione
C'è uno strumento disponibile su http://ora2pg.darold.net/ che può essere utilizzato per trasferire gli schemi Oracle in schemi Postgres, ma non sono sicuro che tradurrà anche le procedure memorizzate. Ma potrebbe fornire un punto di partenza.
Altri suggerimenti
Ho lavorato su una conversione da Oracle a Postgres da un po 'di tempo. L'unico modo per farlo è a mano. Ci sono sottili differenze tra le due lingue che possono farti inciampare. Abbiamo provato a utilizzare uno strumento automatizzato, ma ha solo peggiorato il problema e abbiamo finito per eliminare l'output.
C'è anche EnterpriseDB che ha un po 'di compatibilità Oracle per aiutare la migrazione da Oracle. La versione con compatibilità Oracle non è gratuita ma vale la pena dare un'occhiata se si sta eseguendo più di una sola traduzione di procedura.
Usa ora2pg per tradurre il tuo schema.
Per le procedure memorizzate:
- Converti manualmente tutte le istruzioni DECODE () in CASE e tutti i join esterni Oracle WHERE (+) vecchio stile in esplicite istruzioni LEFT OUTER JOIN. Non ho trovato uno strumento per farlo.
- Traduci le funzioni PL / SQL in PL / PGSQL (vedi sotto).
Sarebbe molto bello se qualcuno avviasse un progetto sourceforge per farlo.
Suggerimento suggerimento ...
Ecco cosa intendo per (2) sopra:
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;