

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Emule las matrices PL/SQL asociativas de Oracle en Amazon Aurora PostgreSQL y Amazon RDS for PostgreSQL
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql"></a>

*Rajkumar Raghuwanshi, Bhanu Ganesh Gudivada y Sachin Khanna, Amazon Web Services*

## Resumen
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-summary"></a>

[Este patrón describe cómo emular matrices PL/SQL asociativas de Oracle con posiciones de índice vacías en entornos Amazon [Aurora PostgreSQL y Amazon RDS for PostgreSQL](https://aws.amazon.com/rds/aurora/).](https://aws.amazon.com/rds/postgresql/) También describe algunas de las diferencias entre las matrices PL/SQL asociativas de Oracle y las matrices PostgreSQL con respecto a la forma en que cada una gestiona las posiciones de índice vacías durante las migraciones.

Ofrecemos una alternativa de PostgreSQL al uso de funciones de `aws_oracle_ext` para gestionar posiciones de índice vacías al migrar una base de datos de Oracle. Este patrón utiliza una columna adicional para almacenar las posiciones del índice y mantiene la gestión de matrices dispersas por parte de Oracle, a la vez que incorpora las capacidades nativas de PostgreSQL.

**Oracle**

En Oracle, las recopilaciones pueden inicializarse como vacías y rellenarse mediante el método de recopilación `EXTEND`, que añade elementos `NULL` a la matriz. Cuando se trabaja con matrices PL/SQL asociativas indexadas por`PLS_INTEGER`, el `EXTEND` método agrega `NULL` elementos secuencialmente, pero los elementos también se pueden inicializar en posiciones de índice no secuenciales. Cualquier posición de índice que no esté inicializada de forma explícita permanece vacía.

Esta flexibilidad permite estructuras de matriz dispersas en las que los elementos se pueden rellenar en posiciones arbitrarias. Al recorrer las recopilaciones utilizando un `FOR LOOP` con límites `FIRST` y `LAST`, solo se procesan los elementos inicializados (`NULL` o sin un valor definido), mientras que las posiciones vacías se omiten.

**PostgreSQL (Amazon Aurora y Amazon RDS)**

PostgreSQL gestiona los valores vacíos de forma diferente a los valores `NULL`. Almacena los valores vacíos como entidades distintas que utilizan un byte de almacenamiento. Cuando una matriz tiene valores vacíos, PostgreSQL asigna posiciones de índice secuenciales igual que los valores no vacíos. Sin embargo, la indexación secuencial requiere un procesamiento adicional porque el sistema debe recorrer en iteraciones todas las posiciones indexadas, incluidas las vacías. Esto hace que la creación de matrices tradicional sea ineficiente para conjuntos de datos dispersos.

**AWS Schema Conversion Tool**

El [AWS Schema Conversion Tool () normalmente gestiona las migraciones mediante funciones AWS SCT](https://docs.aws.amazon.com/SchemaConversionTool/). Oracle-to-PostgreSQL `aws_oracle_ext` En este patrón, proponemos un enfoque alternativo que utiliza las capacidades nativas de PostgreSQL, que combina los tipos de matrices de PostgreSQL con una columna adicional para almacenar las posiciones del índice. A continuación, el sistema puede recorrer en iteraciones las matrices utilizando únicamente la columna de índice.

## Requisitos previos y limitaciones
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS.
+ Un usuario AWS Identity and Access Management (IAM) con permisos de administrador.
+ Una instancia compatible con Amazon RDS o Aurora PostgreSQL.
+ Una comprensión básica de las bases de datos relacionales.

**Limitaciones**
+ Algunos Servicios de AWS no están disponibles en todos Regiones de AWS. Para conocer la disponibilidad de las regiones, consulte [Servicios de AWS by Region](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/). Para ver los puntos de conexión específicos, consulte la página [Service endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) y elija el enlace del servicio.

**Versiones de producto**

Este patrón se probó con las siguientes versiones:
+ Amazon Aurora PostgreSQL 13.3
+ Amazon RDS para PostgreSQL 13.3
+ AWS SCT 1.0.674
+ Oracle 12c EE 12.2

## Arquitectura
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-architecture"></a>

**Pila de tecnología de origen**
+ Base de datos de Oracle en las instalaciones

**Pila de tecnología de destino**
+ PostgreSQL de Amazon Aurora
+ Amazon RDS para PostgreSQL

**Arquitectura de destino**

![](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/a62d038c-ca3c-41e1-aa7e-74282d2e54f4/images/13aacf00-655a-4149-a4e7-42b66dbea4e1.png)


En el diagrama se muestra lo siguiente:
+ Una instancia de base de datos de origen de Amazon RDS para Oracle.
+ Una EC2 instancia de Amazon AWS SCT para convertir funciones de Oracle al equivalente de PostgreSQL
+ Una base de datos de destino compatible con Amazon Aurora PostgreSQL.

## Tools (Herramientas)
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-tools"></a>

**Servicios de AWS**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) es un motor de base de datos relacional completamente administrado diseñado para la nube y compatible con MySQL y PostgreSQL.
+ La [edición de Amazon Aurora compatible con PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html) es un motor de base de datos relacional compatible con ACID, completamente administrado que le permite configurar, utilizar y escalar implementaciones de PostgreSQL.
+ [Amazon Elastic Compute Cloud (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) proporciona una capacidad informática escalable en el Nube de AWS. Puede lanzar tantos servidores virtuales como necesite y escalarlos o reducirlos con rapidez.
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) lo ayuda a configurar, utilizar y escalar una base de datos relacional en la Nube de AWS.
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) para Oracle lo ayuda a configurar, utilizar y escalar una base de datos relacional de Oracle en la Nube de AWS.
+ [Amazon Relational Database Service (Amazon RDS) para PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) lo ayuda a configurar, utilizar y escalar una base de datos relacional de PostgreSQL en la Nube de AWS.
+ [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) admite migraciones de bases de datos heterogéneas al convertir automáticamente el esquema de la base de datos de origen y la mayoría del código personalizado a un formato compatible con la base de datos de destino.

**Otras herramientas**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) es un entorno de desarrollo integrado que simplifica el desarrollo y la administración de bases de datos de Oracle, tanto en implementaciones tradicionales como en implementaciones basadas en la nube.
+ [pgAdmin](https://www.pgadmin.org/) es una herramienta de administración de código abierto para PostgreSQL. Proporciona una interfaz gráfica que permite crear, mantener y utilizar objetos de bases de datos. En este patrón, pgAdmin se conecta a la instancia de base de datos de RDS para PostgreSQL y consulta los datos. También puede utilizar el cliente de la línea de comandos psql.

## Prácticas recomendadas
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-best-practices"></a>
+ Pruebe los límites de los conjuntos de datos y los escenarios periféricos.
+ Considere la posibilidad de implementar la gestión de errores para las condiciones de out-of-bounds indexación.
+ Optimice las consultas para evitar analizar conjuntos de datos dispersos.

## Epics
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-epics"></a>

### Comportamiento de las matrices asociativas de Oracle (origen)
<a name="oracle-associative-array-behavior-source"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un PL/SQL bloque de origen en Oracle. | Cree un PL/SQL bloque de origen en Oracle que utilice la siguiente matriz asociativa:<pre>DECLARE<br />    TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer;<br />    cc country_codes;<br />    cc_idx NUMBER := NULL;<br />BEGIN<br />    cc(7) := 'India';<br />    cc(3) := 'UK';<br />    cc(5) := 'USA';<br />    cc(0) := 'China';<br />    cc(-2) := 'Invalid';<br />    dbms_output.put_line('cc_length:' || cc.COUNT);<br />    IF (cc.COUNT > 0) THEN<br />        cc_idx := cc.FIRST;<br />        FOR i IN 1..cc.COUNT LOOP<br />            dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx));<br />            cc_idx := cc.next(cc_idx);<br />        END LOOP;<br />    END IF;<br />END;</pre> | Administrador de base de datos | 
| Ejecute el PL/SQL bloque. | Ejecute el PL/SQL bloque fuente en Oracle. Si hay brechas entre los valores de índice de una matriz asociativa, no se almacena ningún dato en esas brechas. Esto permite que el bucle de Oracle itere únicamente a través de las posiciones del índice. | Administrador de base de datos | 
| Revise la salida. | Se insertaron cinco elementos en la matriz (`cc`) a intervalos no consecutivos. El recuento de matrices se muestra en el resultado siguiente:<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | Administrador de base de datos | 

### Comportamiento de la matriz asociativa de PostgreSQL (destino)
<a name="postgresql-associative-array-behavior-target"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un PL/pgSQL bloque de destino en PostgreSQL. | Cree un PL/pgSQL bloque de destino en PostgreSQL que utilice la siguiente matriz asociativa:<pre>DO $$<br />DECLARE<br />    cc character varying(100)[];<br />    cc_idx integer := NULL;<br />BEGIN<br />    cc[7] := 'India';<br />    cc[3] := 'UK';<br />    cc[5] := 'USA';<br />    cc[0] := 'China';<br />    cc[-2] := 'Invalid';<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1)<br />        LOOP<br />            RAISE NOTICE 'cc_idx:% country:%', i, cc[i];<br />        END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | Administrador de base de datos | 
| Ejecute el bloque. PL/pgSQL  | Ejecute el PL/pgSQL bloque de destino en PostgreSQL. Si hay brechas entre los valores de índice de una matriz asociativa, no se almacena ningún dato en esas brechas. Esto permite que el bucle de Oracle itere únicamente a través de las posiciones del índice. | Administrador de base de datos | 
| Revise la salida. | La longitud de la matriz es superior a 5 porque `NULL` se almacena en las brechas entre las posiciones del índice. Como se muestra en el siguiente resultado, el bucle completa 10 iteraciones para recuperar 5 valores de la matriz.<pre>cc_length:10<br />cc_idx:-2 country:Invalid<br />cc_idx:-1 country:<NULL><br />cc_idx:0 country:China<br />cc_idx:1 country:<NULL><br />cc_idx:2 country:<NULL><br />cc_idx:3 country:UK<br />cc_idx:4 country:<NULL><br />cc_idx:5 country:USA<br />cc_idx:6 country:<NULL><br />cc_idx:7 country:India</pre> | Administrador de base de datos | 

### Emulación del comportamiento de una matriz asociativa de Oracle
<a name="emulate-oracle-associative-array-behavior"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un PL/pgSQL bloque de destino con una matriz y un tipo definido por el usuario. | Para optimizar el rendimiento y adaptarlo a la funcionalidad de Oracle, podemos crear un tipo definido por el usuario que almacene tanto las posiciones del índice como sus datos correspondientes. Este enfoque reduce las iteraciones innecesarias al mantener las asociaciones directas entre los índices y los valores.<pre>DO $$<br />DECLARE<br />    cc country_codes[];<br />    cc_append country_codes := NULL;<br />    i record;<br />BEGIN<br />    cc_append.idx = 7;<br />    cc_append.val = 'India';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 3;<br />    cc_append.val = 'UK';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 5;<br />    cc_append.val = 'USA';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 0;<br />    cc_append.val = 'China';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = - 2;<br />    cc_append.val = 'Invalid';<br />    cc := array_append(cc, cc_append);<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN (<br />            SELECT<br />                *<br />            FROM<br />                unnest(cc)<br />            ORDER BY<br />                idx)<br />                LOOP<br />                    RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val;<br />                END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | Administrador de base de datos | 
| Ejecuta el PL/pgSQL bloque. | Ejecuta el PL/pgSQL bloque objetivo. Si hay brechas entre los valores de índice de una matriz asociativa, no se almacena ningún dato en esas brechas. Esto permite que el bucle de Oracle itere únicamente a través de las posiciones del índice. | Administrador de base de datos | 
| Revise la salida. | Como se muestra en el siguiente resultado, el tipo definido por el usuario almacena solo los elementos de datos rellenados, lo que significa que la longitud de la matriz coincide con el número de valores. Como resultado, las iteraciones de `LOOP` se optimizan para procesar solo los datos existentes, lo que elimina la necesidad de rastrear las posiciones vacías.<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | Administrador de base de datos | 

## Recursos relacionados
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-resources"></a>

**AWS documentación**
+ [AWS blog de base de datos](https://aws.amazon.com/blogs/database/)
+ [Manual de estrategias de migración de Oracle a Aurora PostgreSQL](https://docs.aws.amazon.com/dms/latest/oracle-to-aurora-postgresql-migration-playbook/chap-oracle-aurora-pg.html)

**Otra documentación**
+ [Matrices asociativas de Oracle](https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/associative-arrays.html#GUID-8060F01F-B53B-48D4-9239-7EA8461C2170)
+ [Funciones y operadores de matriz de PostgreSQL](https://www.postgresql.org/docs/current/functions-array.html)
+ [Tipos de PostgreSQL definidos por el usuario](https://www.postgresql.org/docs/current/sql-createtype.html)