Frage

Gibt es ein Tool (vorzugsweise kostenlos), die von Oracle PL / SQL Stored Procedure Sprache in PLs Postgresql übersetzen wird / pgSQL gespeicherte Prozedur Sprache?

War es hilfreich?

Lösung

Es ist ein Werkzeug zur Verfügung, unter http://ora2pg.darold.net/ , die verwendet werden können, Oracle-Schema zu Postgres Schema transalate, aber ich bin nicht sicher, ob es wird auch die gespeicherten Prozeduren übersetzen. Aber es könnte einen Ort beginnen liefern.

Andere Tipps

Nachdem schon seit geraumer Zeit auf einer Oracle zu Postgres Umwandlung gearbeitet. Der einzige Weg, es zu tun ist, von Hand. Es gibt subtile Unterschiede zwischen den beiden Sprachen, die Sie oben stolpern kann. Wir haben versucht, ein automatisiertes Tool, aber es hat nur das Problem noch schlimmer und am Ende haben wir die Ausgabe Wegwerfen.

Es gibt auch EnterpriseDB , die einen ziemlich viel Oracle Kompatibilität Migration von Oracle zu helfen hat. Die Version mit Oracle-Kompatibilität ist nicht frei, aber ein Blick wert, wenn Sie mehr tun, als nur eine Prozedur Übersetzung.

Verwenden Sie ora2pg Ihr Schema zu übersetzen.

Für gespeicherte Prozeduren:

  1. konvertieren Sie manuell alle DECODE () zu CASE-Anweisungen und alle alten Stil Oracle WHERE (+) Outer-Joins auf explizite LEFT OUTER JOIN-Anweisungen. Ich habe nicht ein Werkzeug zu tun.
  2. gefunden
  3. Übersetzen PL / SQL-Funktionen in PL / PGSQL (siehe unten).

Es wäre sehr schön, wenn jemand ein Projekt Source, dies zu tun gestartet.
Hinweis Hinweis ...

Hier ist, was ich meine, für (2) oben:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top