2008-10-01 28 views

回答

3

http://ora2pg.darold.net/有一個工具可用於將Oracle模式轉換爲Postgres模式,但我不確定它是否也會轉換存儲過程。 但它可能提供了一個開始的地方。

+0

從列入ora2pg發行的TODO文件... 下需要你的貢獻: \t - SQL查詢轉換器。 \t - PL/SQL代碼轉換器。 – dacracot 2008-10-01 16:29:33

+0

進一步看,它似乎會出口包裹,但似乎沒有信心,他們將工作100%。值得一試。 – dacracot 2008-10-01 16:34:01

2

還有EnterpriseDB,它具有相當的Oracle兼容性來幫助從Oracle遷移。與Oracle兼容的版本不是免費的,但值得一看,如果你不只是一個程序翻譯。

2

一直在從事甲骨文到Postgres的轉換工作很長一段時間。唯一的辦法就是手動。這兩種語言之間有細微的差別,可能會讓你感覺不舒服。我們嘗試使用自動化工具,但這隻會讓問題變得更糟,我們最終會摧毀輸出。

2

使用ora2pg來轉換您的模式。

對於存儲過程:

  1. 手動轉換所有DECODE()來CASE語句和所有舊式的Oracle WHERE(+)外連接,以明確LEFT OUTER JOIN語句。我還沒有找到一個工具來做到這一點。
  2. 在PL/PGSQL中翻譯PL/SQL函數(見下文)。

如果有人啓動了一個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;