Lide com funções sobrecarregadas do Oracle no Aurora compatível com PostgreSQL - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Lide com funções sobrecarregadas do Oracle no Aurora compatível com PostgreSQL

Criado por Sumana Yanamandra (AWS)

Ambiente: PoC ou piloto

Origem: banco de dados Oracle

Destino: Aurora PostgreSQL compatível

Tipo R: redefinir a plataforma

Workload: Oracle

Tecnologias: banco de dados; migração

Serviços da AWS: Amazon Aurora

Resumo

O código que você migra de um banco de dados Oracle on-premises para o Amazon Aurora edição compatível com PostgreSQL pode incluir funções sobrecarregadas. Essas funções têm a mesma definição, ou seja, o mesmo nome da função e o mesmo número e tipo de dados dos parâmetros de entrada (IN), mas o tipo de dados ou o número de parâmetros de saída (OUT) podem ser diferentes. 

Essas incompatibilidades de parâmetros podem causar problemas no PostgreSQL, porque é difícil determinar qual função executar. Esse padrão ilustra como lidar com funções sobrecarregadas ao migrar o código do banco de dados para o Aurora compatível com PostgreSQL.

Pré-requisitos e limitações

Pré-requisitos

  • Uma instância de banco de dados Oracle como seu banco de dados de origem

  • Uma instância de banco de dados compatível com o Aurora PostgreSQL como seu banco de dados de destino (consulte as instruções na documentação do Aurora)

Versões do produto

Ferramentas

Serviços da AWS

Outras ferramentas

  • O Oracle SQL Developer é um ambiente de desenvolvimento gratuito e integrado para trabalhar com SQL em bancos de dados Oracle em implantações tradicionais e em nuvem. 

  • O pgAdmin é uma ferramenta de gerenciamento de software livre para PostgreSQL. Fornece uma interface gráfica que ajuda você a criar, manter e usar objetos de banco de dados.

Épicos

TarefaDescriçãoHabilidades necessárias
Crie uma função no PostgreSQL que tenha um parâmetro de entrada e um parâmetro de saída.

O exemplo a seguir ilustra uma função nomeada test_overloading no Aurora compatível com PostgreSQL. Essa função tem dois parâmetros: um parâmetro de texto de entrada e um parâmetro de texto de saída.

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text)     LANGUAGE 'plpgsql'     COST 100     VOLATILE AS $BODY$ DECLARE BEGIN          str2 := 'Success';     RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
Engenheiro de dados, Aurora compatível com PostgreSQL
Execute a função no PostgreSQL.

Execute a função que você criou na etapa anterior.

select public.test_overloading('Test');

Isso deve mostrar a seguinte saída.

Success
Engenheiro de dados, Aurora compatível com PostgreSQL
TarefaDescriçãoHabilidades necessárias
Use o mesmo nome de função para criar uma função sobrecarregada no PostgreSQL.

Crie uma função sobrecarregada no Aurora compatível com PostgreSQL que use o mesmo nome da função anterior. O exemplo a seguir também é nomeado test_overloading, mas tem três parâmetros: um parâmetro de texto de entrada, um parâmetro de texto de saída e um parâmetro inteiro de saída.

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          OUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text;   BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
Engenheiro de dados, Aurora compatível com PostgreSQL
Execute a função no PostgreSQL.

Quando você executa essa função, ela falha com a seguinte mensagem de erro. 

ERROR: cannot change return type of existing function HINT:      Use DROP FUNCTION test_overloading(text) first.

Isso acontece porque o Aurora compatível com PostgreSQL não oferece suporte direto à sobrecarga de funções. Ele não consegue identificar qual função executar, porque o número de parâmetros de saída é diferente na segunda versão da função, embora os parâmetros de entrada sejam os mesmos.

Engenheiro de dados, Aurora compatível com PostgreSQL
TarefaDescriçãoHabilidades necessárias
Adicione INOUT ao primeiro parâmetro de saída.

Como solução alternativa, modifique o código da função representando o primeiro parâmetro de saída como INOUT.

CREATE OR REPLACE FUNCTION public.test_overloading(          str1 text,          INOUT str2 text,          OUT num1 integer)     LANGUAGE 'plpgsql'       COST 100     VOLATILE AS $BODY$ DECLARE str3 text; BEGIN            str2 := 'Success';          num1 := 100;       RETURN ;     EXCEPTION         WHEN others THEN              RETURN ; END; $BODY$;
Engenheiro de dados, Aurora compatível com PostgreSQL
Execute a função revisada.

Execute a função que você atualizou usando a consulta a seguir. Você passa um valor nulo como segundo argumento dessa função, porque declarou esse parâmetro como INOUT para evitar o erro. 

select public.test_overloading('Test', null);

A função agora foi criada com sucesso.

Success, 100
Engenheiro de dados, Aurora compatível com PostgreSQL
Validação dos resultados.

Verifique se o código com a função sobrecarregada foi convertido com êxito.

Engenheiro de dados, Aurora compatível com PostgreSQL

Recursos relacionados