将Oracle PL / SQL转换为Postgresql PL / pgSQL的工具[关闭]
-
03-07-2019 - |
题
是否有工具(最好是免费的)将Oracle的PL / SQL存储过程语言转换为Postgresql的PL / pgSQL存储过程语言?
解决方案
http://ora2pg.darold.net/ 上有一个工具可供使用将Oracle Schema转换为Postgres模式,但我不确定它是否也会转换存储过程。 但它可能提供一个起点。
其他提示
在相当一段时间内一直致力于Oracle到Postgres的转换。唯一的方法是手工完成。这两种语言之间存在微妙的差异,可能会让您失望。我们尝试使用自动化工具,但它只会使问题变得更糟,我们最终破坏了输出。
还有 EnterpriseDB ,它具有相当多的Oracle兼容性,可帮助从Oracle迁移。具有Oracle兼容性的版本不是免费的,但如果您只做一个以上的过程转换,那么值得一看。
使用ora2pg翻译您的架构。
对于存储过程:
- 将所有DECODE()手动转换为CASE语句,将所有旧式Oracle WHERE(+)外连接手动转换为显式LEFT OUTER JOIN语句。我还没有找到这样做的工具。
- 翻译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;
不隶属于 StackOverflow