sql >> Database >  >> RDS >> Oracle

Doel van het gebruik van verschillende soorten PL/SQL-verzamelingen in Oracle

Laten we beginnen met geneste tabellen, ze zijn de meest voorkomende vorm van verzameling en vormen dus een nuttige vergelijkingsbasis.

Een geneste tabel is een variabele die meer dan één instantie van iets kan bevatten, vaak een record uit een databasetabel. Ze kunnen als volgt worden gedeclareerd:

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

Ze zijn handig wanneer we meerdere instanties van gegevens willen opslaan waartegen we hetzelfde willen doen. Het klassieke voorbeeld is het gebruik van BULK COLLECT om meerdere records op te slaan:

select * 
bulk collect into emp_rec_nt
from employees;

Dit geeft ons een gegevensbron die we kunnen ronddraaien; cruciaal is dat we zowel achteruit als vooruit kunnen navigeren, zelfs naar het einde of het begin kunnen gaan, wat we niet met een cursor kunnen doen. Geneste tabellen kunnen verzamelingen zijn van elk gegevenstype, inclusief composieten zoals PL/SQL-records of door de gebruiker gedefinieerde typen.

Een Index By-tabel wordt beter (zoals de documenten doen) een Associative Array genoemd. Dit zijn eenvoudige verzamelingen van enkele attributen met een index. Geneste tabellen hebben ook indexen, maar hun indexen zijn slechts rijtellingen. Met een associatieve array kan de index zinvol zijn, d.w.z. afkomstig uit een gegevenswaarde. Ze zijn dus handig voor het cachen van gegevenswaarden voor later gebruik. De index kan een getal zijn, of (sinds 9iR2) een string die erg handig kan zijn. Hier is bijvoorbeeld een associatieve reeks salarissen die wordt geïndexeerd door de werknemer-ID.

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

Merk op dat ik die array had kunnen declareren met INDEX BY BINARY_INTEGER, maar het is duidelijker om in plaats daarvan de %TYPE-syntaxis te gebruiken (zelfdocumenterende code). Elementen van die array kunnen worden geïdentificeerd door een indexwaarde, in dit geval EMPNO:

l_emp_sals(l_emp_no) := l_emp_sal;

Behalve het cachen van referentietabellen of vergelijkbare opzoekwaarden zijn er niet veel toepassingen voor associatieve arrays.

Variabele arrays zijn slechts geneste tabellen met een vooraf gedefinieerde limiet voor het aantal elementen. Dus misschien is de naam misleidend:het zijn eigenlijk vaste arrays. Er is weinig dat we kunnen doen met VARrays wat we niet kunnen doen met geneste tabellen (behalve het aantal elementen beperken en het is vrij zeldzaam dat we dat zouden willen doen). Ze worden als volgt gedeclareerd:

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

We kunnen bulkverzameling gebruiken om een ​​VArray te vullen ...

select * 
bulk collect into emp_rec_va
from employees;

We moeten er echter zeker van zijn dat de zoekopdracht maximaal . zal opleveren het aantal elementen gespecificeerd in de VArray-declaratie. Anders zal de SELECT ORA-22165 over de kop smijten.

Er zijn geen use-cases bekend voor variabele arrays. Oké, dat is een beetje hard, maar bijna altijd zul je in plaats daarvan geneste tabellen gebruiken. Het enige grote voordeel van VARrays ten opzichte van geneste tabellen is dat ze de volgorde van de elementen garanderen. Dus als u elementen in dezelfde volgorde moet verwijderen als waarin u ze hebt ingevoegd, gebruik dan een VArray.

De PL/SQL-documentatie wijdt een heel hoofdstuk aan collecties. Lees meer.



  1. Wat doet (+) in Oracle SQL?

  2. Databasetabellen maken met SQL

  3. Hoe praat Access met ODBC-gegevensbronnen? Deel 3

  4. Hoe de sortering van een tabel in MySQL te tonen