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?

È stato utile?

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:

  1. 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.
  2. 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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top