Werkzeug für die Übersetzung von Oracle PL / SQL in Postgresql PL / pgSQL [geschlossen]
-
03-07-2019 - |
Frage
Gibt es ein Tool (vorzugsweise kostenlos), die von Oracle PL / SQL Stored Procedure Sprache in PLs Postgresql übersetzen wird / pgSQL gespeicherte Prozedur Sprache?
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:
- 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. gefunden
- Ü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;