View a markdown version of this page

Migre pacotes Oracle SERIALLY_REUSABLE Pragma para o Amazon Aurora ou o Amazon RDS for 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á.

Migre pacotes Oracle SERIALLY_REUSABLE Pragma para o Amazon Aurora ou o Amazon RDS for PostgreSQL

Vinay Paladi, Amazon Web Services

Resumo

Esse padrão fornece uma abordagem passo a passo para migrar pacotes Oracle que usam o PRAGMA SERIALLY_REUSABLE para o Amazon Aurora Edition PostgreSQL-Compatible ou o Amazon RDS for PostgreSQL ativado, mantendo a funcionalidade original. AWS

O PRAGMA SERIALLY_REUSABLE indica que o estado do pacote é necessário somente durante uma chamada ao servidor (por exemplo, um bloco PL/SQL anônimo ou uma chamada de procedimento armazenado por meio de um link de banco de dados). Após essa chamada, o armazenamento das variáveis do pacote pode ser reutilizado, reduzindo o consumo de memória.

O PostgreSQL não oferece suporte nativo ao conceito do pragma SERIALLY_REUSABLE. Para obter uma funcionalidade equivalente, esse padrão usa uma abordagem de função wrapper combinada com o recurso AWS Database Migration Service (AWS DMS) Schema Conversion (AWS DMS SC) para migrar a estrutura do pacote. O script de exemplo fornecido demonstra como preservar o comportamento de redefinição em cada chamada no PostgreSQL.

Para obter mais informações, consulte o Pragma SERIALLY_REUSABLE na documentação da Oracle.

Pré-requisitos e limitações

  • Um ativo Conta da AWS

  • Acesso ao serviço de conversão de AWS DMS esquema

  • Um banco de dados Amazon Aurora PostgreSQL-Compatible Edition ou um banco de dados Amazon RDS for PostgreSQL

  • Banco de dados Oracle versão 10g ou posterior

Arquitetura

Pilha de tecnologia de origem

  • On-premises Banco de dados Oracle

Pilha de tecnologias de destino

Arquitetura de migração

Migre pacotes Oracle SERIALLY_REUSABLE Pragma para o Amazon Aurora ou o Amazon RDS for PostgreSQL

Ferramentas

Serviços da AWS

Outras ferramentas

  • O pgAdmin é uma ferramenta de gerenciamento de código aberto para PostgreSQL. Ele fornece uma interface gráfica que ajuda você a criar, manter e usar objetos de banco de dados.

Práticas recomendadas

  • Sempre use reset_vars = 1 para chamadas de nível superior e reset_vars = 0 para subchamadas internas.

  • Mantenha todos os valores padrão na $init função como uma única fonte confiável.

  • Combine os nomes das variáveis Oracle no PostgreSQL para rastreabilidade.

  • Valide comparando o Oracle DBMS_OUTPUT com a saída do PostgreSQLRAISE NOTICE.

  • Teste em sessões separadas do PostgreSQL para confirmar a redefinição das variáveis entre as chamadas.

Épicos

TarefaDescriptionHabilidades necessárias

Configure o AWS DMS SC.

Configure a AWS DMS conectividade com o banco de dados de origem. Para obter mais informações, consulte Conversão de esquemas de banco de dados usando a conversão de esquema DMS.

DBA, Desenvolvedor

Converter o script.

Use o AWS DMS SC para converter o pacote Oracle selecionando o banco de dados de destino como Aurora PostgreSQL-Compatible.

DBA, Desenvolvedor

Salve os arquivos .sql.

Antes de salvar o arquivo.sql, modifique a opção Configurações do projeto no AWS DMS SC para Arquivo único por estágio. Isso configura AWS DMS a separação do arquivo.sql em vários arquivos.sql com base no tipo de objeto.

DBA, Desenvolvedor

Alterar o código.

Abra a init função gerada pelo AWS DMS SC e altere-a conforme mostrado no exemplo na seção Informações adicionais. Ele adicionará uma variável para obter a funcionalidade reset_vars = 0.

DBA, Desenvolvedor

Teste a conversão.

Implante a init função no PostgreSQL-Compatible banco de dados Aurora e teste os resultados.

DBA, Desenvolvedor

Solução de problemas

ProblemaSolução

Erro de campo não existe ao acessar variáveis do pacote.

Certifique-se de que a condição da $init função use IF v_need_init ou reset_vars = 1 para que as variáveis sejam sempre criadas no primeiro acesso em uma sessão.

Variáveis que não são redefinidas entre chamadas de nível superior ou são redefinidas inesperadamente durante subchamadas internas.

Use reset_vars = 1 para chamadas diretas de nível superior e passe reset_vars = 0 para chamadas internas de função para função.

Recursos relacionados

Mais informações

-------Source Oracle Code: CREATE OR REPLACE PACKAGE test_pkg_var IS PRAGMA SERIALLY_REUSABLE; PROCEDURE function_1(test_id NUMBER); PROCEDURE function_2(test_id NUMBER); END; / CREATE OR REPLACE PACKAGE BODY test_pkg_var IS PRAGMA SERIALLY_REUSABLE; v_char VARCHAR2(20) := 'DEFAULT_VALUE'; v_num NUMBER := 123; PROCEDURE function_2(test_id NUMBER) IS BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END; PROCEDURE function_1(test_id NUMBER) IS BEGIN dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num); v_char := 'MODIFIED_VALUE'; dbms_output.put_line('function_1 => v_char after update=' || v_char); function_2(0); END; END test_pkg_var; / SET SERVEROUTPUT ON EXEC test_pkg_var.function_1(1); EXEC test_pkg_var.function_2(1); ------Target PostgreSQL Code: CREATE SCHEMA IF NOT EXISTS testoracle; CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$ DECLARE v_need_init BOOLEAN; BEGIN v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var'); IF v_need_init OR reset_vars = 1 THEN PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20)); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123); END IF; END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20)); RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)); CALL testoracle.test_pkg_var$function_2(0); END; $BODY$ LANGUAGE plpgsql; CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$ BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars); RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION); END; $BODY$ LANGUAGE plpgsql; CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE' CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'