

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
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Vinay Paladi, Amazon Web Services*

## Resumo
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-summary"></a>

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)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) 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](https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/SERIALLY_REUSABLE-pragma.html) na documentação da Oracle.

## Pré-requisitos e limitações
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>
+ 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
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-architecture"></a>

**Pilha de tecnologia de origem**
+ On-premises Banco de dados Oracle

**Pilha de tecnologias de destino**
+ [Aurora PostgreSQL-Compatible](https://aws.amazon.com/rds/aurora/details/postgresql-details/) ou Amazon RDS para Amazon RDS for PostgreSQL
+ AWS DMS Conversão de esquema

**Arquitetura de migração**

![Migre pacotes Oracle SERIALLY_REUSABLE Pragma para o Amazon Aurora ou o Amazon RDS for PostgreSQL](https://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/955ed078-0941-4ae6-b56e-964379a29365.jpeg)


## Ferramentas
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-tools"></a>

**Serviços da AWS**
+ [AWS Database Migration Service (AWS DMS) A conversão de esquema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) torna as migrações de banco de dados entre diferentes tipos de bancos de dados mais previsíveis. Use-o para avaliar a complexidade de sua migração para seu provedor de dados de origem e para converter esquemas de banco de dados e objetos de código. É possível aplicar o código convertido ao banco de dados de destino.
+ [O Amazon Aurora PostgreSQL-Compatible Edition](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) é um mecanismo de banco de dados ACID-compliant relacional totalmente gerenciado que ajuda você a configurar, operar e escalar implantações do PostgreSQL.
+ O [Amazon Relational Database Service (Amazon RDS) para PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) ajuda você a configurar, operar e escalar um banco de dados relacional do PostgreSQL na Nuvem AWS.

**Outras ferramentas**
+ O [pgAdmin](https://www.pgadmin.org/) é 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
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-best-practices"></a>
+ 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 PostgreSQL`RAISE NOTICE`.
+ Teste em sessões separadas do PostgreSQL para confirmar a redefinição das variáveis entre as chamadas.

## Épicos
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-epics"></a>

### Migre o pacote Oracle usando AWS DMS SC
<a name="migrate-the-oracle-package-by-using-dms-sc"></a>


| Tarefa | Description | Habilidades 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.](https://docs.aws.amazon.com/dms/latest/userguide/getting-started.html) | 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
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-troubleshooting"></a>


| Problema | Soluçã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
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS DMS Conversão de esquema](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Características do Amazon Aurora](https://aws.amazon.com/rds/aurora/postgresql-features/)
+ [Pragma SERIALLY\_REUSABLE](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/seriallyreusable_pragma.htm#LNPLS01346)

## Mais informações
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-additional"></a>

```
-------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'
```