Pergunta

Existe uma ferramenta (de preferência livre) que irá traduzir PL / SQL armazenado linguagem processo da Oracle em PL / pgSQL linguagem de procedimentos armazenados do PostgreSQL?

Foi útil?

Solução

Há uma ferramenta disponível em http://ora2pg.darold.net/ que pode ser usado para transalate a Oracle esquemas para esquemas Postgres, mas eu não tenho certeza se ele também irá traduzir os procedimentos armazenados. Mas pode fornecer um lugar para começar.

Outras dicas

Depois de ter trabalhado em uma conversão Oracle para Postgres por algum tempo. A única maneira de fazer isso é com a mão. Há diferenças sutis entre as duas línguas que podem te enganar. Tentamos usar uma ferramenta automatizada, mas isso só fez o problema pior e acabamos destruindo a saída.

Há também EnterpriseDB que tem uma um pouco de compatibilidade Oracle para ajudar a migração de Oracle. A versão com compatibilidade com Oracle não é gratuito, mas vale a pena olhar se você está fazendo mais do que apenas uma tradução procedimento.

Use ora2pg para traduzir seu esquema.

Para procedimentos armazenados:

  1. manualmente converter todos DECODE () para instruções CASE e toda a Oracle velho estilo WHERE (+) junções externas explicitar LEFT OUTER JOIN. Eu não encontrei uma ferramenta para fazer isso.
  2. Traduzir funções PL / SQL em PL / pgSQL (veja abaixo).

Seria muito bom se alguém iniciou um projeto sourceforge para fazer isso.
Dica dica ...

Aqui está o que eu quero dizer para (2) acima:

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top