Emula gli array PL/SQL associativi Oracle in Amazon Aurora PostgreSQL e Amazon RDS per PostgreSQL - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Emula gli array PL/SQL associativi Oracle in Amazon Aurora PostgreSQL e Amazon RDS per PostgreSQL

Rajkumar Raghuwanshi, Bhanu Ganesh Gudivada e Sachin Khanna, Amazon Web Services

Riepilogo

Questo modello descrive come emulare gli array PL/SQL associativi Oracle con posizioni di indice vuote in ambienti Amazon Aurora PostgreSQL e Amazon RDS for PostgreSQL. Descrive inoltre alcune delle differenze tra gli array PL/SQL associativi Oracle e gli array PostgreSQL per quanto riguarda il modo in cui ciascuno gestisce le posizioni degli indici vuoti durante le migrazioni.

Forniamo un'alternativa PostgreSQL all'aws_oracle_extutilizzo di funzioni per la gestione delle posizioni di indice vuote durante la migrazione di un database Oracle. Questo modello utilizza una colonna aggiuntiva per memorizzare le posizioni degli indici e mantiene la gestione degli array sparsi da parte di Oracle incorporando funzionalità PostgreSQL native.

Oracle

In Oracle, le raccolte possono essere inizializzate come vuote e popolate utilizzando il metodo EXTEND collection, che aggiunge elementi all'array. NULL Quando si lavora con array PL/SQL associativi indicizzati daPLS_INTEGER, il EXTEND metodo aggiunge NULL elementi in sequenza, ma gli elementi possono anche essere inizializzati in posizioni di indice non sequenziali. Qualsiasi posizione dell'indice che non sia inizializzata in modo esplicito rimane vuota.

Questa flessibilità consente strutture di array sparse in cui gli elementi possono essere popolati in posizioni arbitrarie. Quando si esegue un'iterazione tra le raccolte utilizzando un FOR LOOP with FIRST e un LAST bounds, vengono elaborati solo gli elementi inizializzati (con NULL o con un valore definito), mentre le posizioni vuote vengono saltate.

PostgreSQL (Amazon Aurora e Amazon RDS)

PostgreSQL gestisce i valori vuoti in modo diverso dai valori. NULL Memorizza i valori vuoti come entità distinte che utilizzano un byte di archiviazione. Quando un array ha valori vuoti, PostgreSQL assegna posizioni di indice sequenziali proprio come valori non vuoti. Ma l'indicizzazione sequenziale richiede un'elaborazione aggiuntiva perché il sistema deve scorrere attraverso tutte le posizioni indicizzate, comprese quelle vuote. Ciò rende la creazione di array tradizionali inefficiente per set di dati sparsi.

AWS Schema Conversion Tool

Il AWS Schema Conversion Tool (AWS SCT) in genere gestisce le Oracle-to-PostgreSQL migrazioni utilizzando le funzioni. aws_oracle_ext In questo modello, proponiamo un approccio alternativo che utilizza le funzionalità native di PostgreSQL, che combina i tipi di array PostgreSQL con una colonna aggiuntiva per l'archiviazione delle posizioni degli indici. Il sistema può quindi eseguire iterazioni tra gli array utilizzando solo la colonna dell'indice.

Prerequisiti e limitazioni

Prerequisiti

  • Un attivo. Account AWS

  • Un utente AWS Identity and Access Management (IAM) con autorizzazioni di amministratore.

  • Un'istanza compatibile con Amazon RDS o Aurora PostgreSQL.

  • Una conoscenza di base dei database relazionali.

Limitazioni

Versioni del prodotto

Questo modello è stato testato con le seguenti versioni:

  • Amazon Aurora PostgreSQL 13.3

  • Amazon RDS per PostgreSQL 13.3

  • AWS SCT 1.0.674

  • Oracle12c EE 12.2

Architettura

Stack tecnologico di origine

  • Database Oracle locale

Stack tecnologico Target

  • Amazon Aurora PostgreSQL

  • Amazon RDS per PostgreSQL

Architettura di destinazione

Il diagramma mostra:

  • Un'istanza di database Amazon RDS for Oracle di origine

  • Un' EC2 istanza Amazon AWS SCT per convertire le funzioni Oracle nell'equivalente di PostgreSQL

  • Un database di destinazione compatibile con Amazon Aurora PostgreSQL

Strumenti

Servizi AWS

Altri strumenti

  • Oracle SQL Developer è un ambiente di sviluppo integrato che semplifica lo sviluppo e la gestione dei database Oracle nelle implementazioni tradizionali e basate sul cloud.

  • pgAdmin è uno strumento di gestione open source per PostgreSQL. Fornisce un'interfaccia grafica che consente di creare, gestire e utilizzare oggetti di database. In questo modello, pgAdmin si connette all'istanza del database RDS per PostgreSQL e interroga i dati. In alternativa, puoi usare il client da riga di comando psql.

Best practice

  • Verifica i limiti dei set di dati e gli scenari periferici.

  • Prendi in considerazione l'implementazione della gestione degli errori per le condizioni out-of-bounds dell'indice.

  • Ottimizza le query per evitare la scansione di set di dati sparsi.

Epiche

AttivitàDescrizioneCompetenze richieste

Crea un PL/SQL blocco sorgente in Oracle.

Crea un PL/SQL blocco sorgente in Oracle che utilizza il seguente array associativo:

DECLARE TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer; cc country_codes; cc_idx NUMBER := NULL; BEGIN cc(7) := 'India'; cc(3) := 'UK'; cc(5) := 'USA'; cc(0) := 'China'; cc(-2) := 'Invalid'; dbms_output.put_line('cc_length:' || cc.COUNT); IF (cc.COUNT > 0) THEN cc_idx := cc.FIRST; FOR i IN 1..cc.COUNT LOOP dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx)); cc_idx := cc.next(cc_idx); END LOOP; END IF; END;
DBA

Esegui il PL/SQL blocco.

Esegui il PL/SQL blocco sorgente in Oracle. Se ci sono degli spazi tra i valori di indice di un array associativo, in tali spazi non viene memorizzato alcun dato. Ciò consente al ciclo Oracle di scorrere solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

Cinque elementi sono stati inseriti nell'array (cc) a intervalli non consecutivi. Il conteggio degli array è mostrato nel seguente output:

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA
AttivitàDescrizioneCompetenze richieste

Crea un PL/pgSQL blocco di destinazione in PostgreSQL.

Crea un PL/pgSQL blocco di destinazione in PostgreSQL che utilizza il seguente array associativo:

DO $$ DECLARE cc character varying(100)[]; cc_idx integer := NULL; BEGIN cc[7] := 'India'; cc[3] := 'UK'; cc[5] := 'USA'; cc[0] := 'China'; cc[-2] := 'Invalid'; RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1) LOOP RAISE NOTICE 'cc_idx:% country:%', i, cc[i]; END LOOP; END IF; END; $$;
DBA

Esegui il PL/pgSQL blocco.

Esegui il PL/pgSQL blocco di destinazione in PostgreSQL. Se ci sono degli spazi tra i valori dell'indice di un array associativo, nessun dato viene memorizzato in tali spazi. Ciò consente al ciclo Oracle di scorrere solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

La lunghezza dell'array è maggiore di 5 perché NULL è memorizzata negli spazi tra le posizioni dell'indice. Come mostrato nell'output seguente, il ciclo completa 10 iterazioni per recuperare 5 valori nell'array.

cc_length:10 cc_idx:-2 country:Invalid cc_idx:-1 country:<NULL> cc_idx:0 country:China cc_idx:1 country:<NULL> cc_idx:2 country:<NULL> cc_idx:3 country:UK cc_idx:4 country:<NULL> cc_idx:5 country:USA cc_idx:6 country:<NULL> cc_idx:7 country:India
DBA
AttivitàDescrizioneCompetenze richieste

Crea un PL/pgSQL blocco di destinazione con un array e un tipo definito dall'utente.

Per ottimizzare le prestazioni e soddisfare le funzionalità di Oracle, possiamo creare un tipo definito dall'utente che memorizza sia le posizioni dell'indice che i dati corrispondenti. Questo approccio riduce le iterazioni non necessarie mantenendo associazioni dirette tra indici e valori.

DO $$ DECLARE cc country_codes[]; cc_append country_codes := NULL; i record; BEGIN cc_append.idx = 7; cc_append.val = 'India'; cc := array_append(cc, cc_append); cc_append.idx = 3; cc_append.val = 'UK'; cc := array_append(cc, cc_append); cc_append.idx = 5; cc_append.val = 'USA'; cc := array_append(cc, cc_append); cc_append.idx = 0; cc_append.val = 'China'; cc := array_append(cc, cc_append); cc_append.idx = - 2; cc_append.val = 'Invalid'; cc := array_append(cc, cc_append); RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ( SELECT * FROM unnest(cc) ORDER BY idx) LOOP RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val; END LOOP; END IF; END; $$;
DBA

Esegui il PL/pgSQL blocco.

Esegui il PL/pgSQL blocco bersaglio. Se ci sono degli spazi tra i valori dell'indice di un array associativo, in tali spazi non viene memorizzato alcun dato. Ciò consente al ciclo Oracle di scorrere solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

Come illustrato nell'output seguente, il tipo definito dall'utente memorizza solo gli elementi di dati popolati, il che significa che la lunghezza dell'array corrisponde al numero di valori. Di conseguenza, LOOP le iterazioni sono ottimizzate per elaborare solo i dati esistenti, eliminando la necessità di tenere traccia delle posizioni vuote.

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA

Risorse correlate

AWS documentazione

Altra documentazione