أداة لترجمة Oracle PL/SQL إلى Postgresql PL/pgSQL [مغلق]
-
03-07-2019 - |
سؤال
هل هناك أداة (يفضل أن تكون مجانية) يمكنها ترجمة لغة الإجراءات المخزنة PL/SQL الخاصة بـ Oracle إلى لغة الإجراءات المخزنة PL/pgSQL الخاصة بـ Postgresql؟
المحلول
وهناك أداة متوفرة في http://ora2pg.darold.net/ التي يمكن استخدامها لtransalate أوراكل المخططات إلى مخططات بوستجرس، ولكن لست متأكدا اذا كان ذلك أيضا ترجمة الإجراءات المخزنة. ولكن قد توفر مكانا للبدء.
نصائح أخرى
وبعد أن تم العمل على أوراكل لبوستجرس تحويل لبعض الوقت. الطريقة الوحيدة للقيام بذلك هي عن طريق اليد. هناك فروق دقيقة بين اللغتين التي يمكن أن الرحلة لكم. حاولنا استخدام أداة آلية لكنه جعل فقط المشكلة سوءا وانتهى التحطيم الإخراج.
وهناك أيضا إنتربرايز التي لديها قليلا جدا من التوافق أوراكل للمساعدة في الهجرة من أوراكل. النسخة مع التوافق أوراكل ليست حرة ولكنها تستحق نظرة إذا كنت تفعل أكثر من ترجمة إجراء واحد فقط.
استخدم ora2pg لترجمة مخططك.
للإجراءات المخزنة:
- قم بتحويل كافة DECODE() إلى عبارات CASE يدويًا وجميع الصلات الخارجية لـ Oracle WHERE (+) ذات النمط القديم إلى عبارات LEFT OUTER JOIN الصريحة.ولم أجد أداة للقيام بذلك.
- ترجمة وظائف PL/SQL في PL/PGSQL (انظر أدناه).
سيكون من الرائع جدًا أن يبدأ شخص ما مشروع sourceforge للقيام بذلك.
تلميح تلميح...
وإليك ما أعنيه بالنسبة (2) أعلاه:
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;