Låt oss börja med kapslade tabeller, de är den vanligaste formen av insamling och utgör därför en användbar jämförelsegrund.
En kapslad tabell är en variabel som kan innehålla mer än en instans av något, ofta en post från en databastabell. De kan deklareras så här:
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
De är användbara när vi vill lagra flera instanser av data mot vilka vi vill göra samma sak. Det klassiska exemplet är att använda BULK COLLECT för att lagra flera poster:
select *
bulk collect into emp_rec_nt
from employees;
Detta ger oss en datakälla som vi kan gå runt; Det är avgörande att vi kan navigera bakåt såväl som framåt, till och med hoppa till slutet eller början, vilket är saker vi inte kan göra med en markör. Kapslade tabeller kan vara samlingar av vilken datatyp som helst, inklusive kompositer som PL/SQL-poster eller användardefinierade typer.
En Index By-tabell kallas bättre (som dokumenten gör) en Associative Array . Det här är enkla samlingar av enkla attribut med ett index. Kapslade tabeller har också index men deras index är bara radantal. Med en associativ array kan indexet vara meningsfullt, d.v.s. hämtat från ett datavärde. Så de är användbara för att cache datavärden för senare användning. Indexet kan vara ett nummer, eller (sedan 9iR2) en sträng som kan vara mycket användbar. Här är till exempel en associativ uppsättning löner som indexeras av anställds identifierare.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Observera att jag kunde ha deklarerat den matrisen med INDEX BY BINARY_INTEGER men det är tydligare att använda %TYPE-syntaxen istället (självdokumenterande kod). Element i den matrisen kan identifieras med ett indexvärde, i detta fall EMPNO:
l_emp_sals(l_emp_no) := l_emp_sal;
Förutom cachning av referenstabeller eller liknande uppslagsvärden finns det inte många användningsfall för associativa arrayer.
Variable arrays är bara kapslade tabeller med en fördefinierad gräns för antalet element. Så kanske namnet är missvisande:de är faktiskt fasta arrayer. Det finns lite vi kan göra med VARrays som vi inte kan göra med kapslade tabeller (förutom att begränsa antalet element och det är ganska sällsynt att vi skulle vilja göra det). De deklareras så här:
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
Vi kan använda massinsamling för att fylla i en VARray ...
select *
bulk collect into emp_rec_va
from employees;
Vi måste dock vara säkra på att frågan kommer att returnera högst antalet element som anges i VARrayens deklaration. Annars kommer SELECT att kasta ORA-22165.
Det finns inga kända användningsfall för variabla arrayer. Okej, det är lite hårt, men nästan hela tiden kommer du att använda kapslade tabeller istället. Den stora fördelen med VARrays jämfört med kapslade tabeller är att de garanterar ordningen på elementen. Så om du måste få ut element i samma ordning som du infogade dem, använd en VARray.
PL/SQL-dokumentationen ägnar ett helt kapitel åt samlingar. Ta reda på mer.