Oracle
 sql >> Database >  >> RDS >> Oracle

Scopo dell'utilizzo di diversi tipi di raccolte PL/SQL in Oracle

Partiamo dalle Nested Tables, sono la forma di raccolta più comune e quindi rappresentano un'utile base di confronto.

Una tabella nidificata è una variabile che può contenere più di un'istanza di qualcosa, spesso un record da una tabella di database. Potrebbero essere dichiarati in questo modo:

type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;

Sono utili ogni volta che vogliamo archiviare più istanze di dati rispetto ai quali vogliamo fare la stessa cosa. L'esempio classico utilizza BULK COLLECT per archiviare più record:

select * 
bulk collect into emp_rec_nt
from employees;

Questo ci fornisce una fonte di dati che possiamo girare; soprattutto possiamo navigare indietro così come in avanti, persino saltare alla fine o all'inizio, che sono cose che non possiamo fare con un cursore. Le tabelle nidificate possono essere raccolte di qualsiasi tipo di dati, inclusi compositi come record PL/SQL o tipi definiti dall'utente.

Una tabella Index By è meglio chiamata (come fanno i documenti) Associative Array . Si tratta di semplici raccolte di attributi singoli con un indice. Anche le tabelle nidificate hanno indici, ma i loro indici sono solo conteggi di righe. Con un array associativo l'indice può essere significativo, cioè derivato da un valore di dati. Quindi sono utili per memorizzare nella cache i valori dei dati per un uso successivo. L'indice può essere un numero o (a partire da 9iR2) una stringa che può essere molto utile. Ad esempio, ecco una matrice associativa di stipendi indicizzata dall'identificatore del dipendente.

type emp_sal_aa is table of emp.sql%type
     index by emp.empno%type;
l_emp_sales emp_sal_aa;

Nota che avrei potuto dichiarare quell'array usando INDEX BY BINARY_INTEGER ma è più chiaro usare invece la sintassi %TYPE (codice autodocumentante). Gli elementi di quell'array possono essere identificati da un valore di indice, in questo caso EMPNO:

l_emp_sals(l_emp_no) := l_emp_sal;

Oltre alla memorizzazione nella cache di tabelle di riferimento o valori di ricerca simili, non ci sono molti casi d'uso per gli array associativi.

Gli array di variabili sono solo tabelle nidificate con un limite predefinito sul numero di elementi. Quindi forse il nome è fuorviante:in realtà sono array fissi. C'è poco che possiamo fare con i VArray che non possiamo fare con le tabelle nidificate (tranne vincolare il numero di elementi ed è piuttosto raro che vorremmo farlo). Sono dichiarati in questo modo:

type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;

Possiamo utilizzare la raccolta in blocco per popolare un VArray ...

select * 
bulk collect into emp_rec_va
from employees;

Tuttavia, dobbiamo essere certi che la query restituirà al massimo il numero di elementi specificato nella dichiarazione di VArray. Altrimenti SELECT lancerà ORA-22165.

Non esistono casi d'uso noti per gli array di variabili. Va bene, è un po 'duro, ma quasi sempre utilizzerai invece tabelle nidificate. L'unico grande vantaggio dei VArray rispetto alle tabelle nidificate è che garantiscono l'ordine degli elementi. Quindi, se devi estrarre gli elementi nello stesso ordine in cui li hai inseriti, usa un VArray.

La documentazione PL/SQL dedica un intero capitolo alle raccolte. Scopri di più.