是否有工具(最好是免费的)可以将 Oracle 的 PL/SQL 存储过程语言翻译成 Postgresql 的 PL/pgSQL 存储过程语言?
dacracot
问问题
18658 次
4 回答
6
http://ora2pg.darold.net/上有一个工具可用于将 Oracle 模式转换为 Postgres 模式,但我不确定它是否也能转换存储过程。但它可能会提供一个开始的地方。
于 2008-10-01T15:58:36.717 回答
5
还有EnterpriseDB,它具有相当多的 Oracle 兼容性,以帮助从 Oracle 迁移。与 Oracle 兼容的版本不是免费的,但如果您要做的不仅仅是一个程序翻译,那么值得一看。
于 2008-10-01T16:07:45.963 回答
5
很长一段时间以来一直致力于 Oracle 到 Postgres 的转换。唯一的方法是手工。两种语言之间存在细微的差异,可能会让您大吃一惊。我们尝试使用自动化工具,但它只会让问题变得更糟,我们最终破坏了输出。
于 2010-10-25T16:43:19.680 回答
2
使用 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;
于 2010-10-27T21:06:42.207 回答