سؤال

هل هناك أداة (يفضل أن تكون مجانية) يمكنها ترجمة لغة الإجراءات المخزنة PL/SQL الخاصة بـ Oracle إلى لغة الإجراءات المخزنة PL/pgSQL الخاصة بـ Postgresql؟

هل كانت مفيدة؟

المحلول

وهناك أداة متوفرة في http://ora2pg.darold.net/ التي يمكن استخدامها لtransalate أوراكل المخططات إلى مخططات بوستجرس، ولكن لست متأكدا اذا كان ذلك أيضا ترجمة الإجراءات المخزنة. ولكن قد توفر مكانا للبدء.

نصائح أخرى

وبعد أن تم العمل على أوراكل لبوستجرس تحويل لبعض الوقت. الطريقة الوحيدة للقيام بذلك هي عن طريق اليد. هناك فروق دقيقة بين اللغتين التي يمكن أن الرحلة لكم. حاولنا استخدام أداة آلية لكنه جعل فقط المشكلة سوءا وانتهى التحطيم الإخراج.

وهناك أيضا إنتربرايز التي لديها قليلا جدا من التوافق أوراكل للمساعدة في الهجرة من أوراكل. النسخة مع التوافق أوراكل ليست حرة ولكنها تستحق نظرة إذا كنت تفعل أكثر من ترجمة إجراء واحد فقط.

استخدم ora2pg لترجمة مخططك.

للإجراءات المخزنة:

  1. قم بتحويل كافة DECODE() إلى عبارات CASE يدويًا وجميع الصلات الخارجية لـ Oracle WHERE (+) ذات النمط القديم إلى عبارات LEFT OUTER JOIN الصريحة.ولم أجد أداة للقيام بذلك.
  2. ترجمة وظائف 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top