

Udtrykket
TYPE cd_titel_tab IS TABLE OF cd.titel%TYPE INDEX BY BINARY_INTEGER; cd_titel cd_titel_tab;
beskriver en samling af CD'er, der kan tilgåes via et numerisk index. Selvom det er muligt via et numerisk index at finde et element, er grænsen typisk at værdien ikke er et tal.
SELECT titel FROM cd; TITEL ------------------------------ A matter of Life and Death Back to Basics Chariot stripped
Ovenfor et uddrag af cd tabellen. Hvis vi nu ønskede at fjerne et element og vi kun havde titlen, skulle vi søge gennem hele samlingen på en ustruktureret måde. Følgende kan illusterere hvad jeg mener:
FOR cursor_column IN cd_titel.FIRST..cd_titel.LAST LOOP IF cd_titel(cursor_column) = 'A matter of Life and Death' THEN cd_titel.DELETE(cursor_column); END IF; END LOOP;
Med Associative Arrays, er nu muligt at pege via index direkte på den CD titel vi leder efter. Der er faktisk et antal metoder til at gøre det idet du kan benytte VARCHAR2, %TYPE m.v. Det er en klar forbedring, over indexering af alt med et tal. Hvis vi så ønsker at fjerne Iron Mainden's - A matter of Life and Death, kan vi benytte en associative array:
DECLARE TYPE cd_titel_tab IS TABLE OF cd.titel%TYPE INDEX BY cd.titel%TYPE; cd_titel cd_titel_tab; BEGIN cd_titel.DELETE('A matter of Life and Death'); END;
Ved at bruge en Associative Array, cd.titel%TYPE, gør vi det, vi vil på en linie, uden at skulle loope gennem hele samlingen.
Ulempen ved Associative Array er som ved PLSQL tabeller, Du kan ikke gemme dem i databasen. De er kun til intern brug i PLSQL applikationer.
Hvornår skal jeg bruge hvad
Hvis du er ny til Collections, kan det godt være svært, selvom man forstår mekanismerne, at vælge hvad man skal bruge i en given situation. Nedenfor en opsummering på mulighederne ved collections.
Kan | Varray | Nested Table | Associative Array |
---|---|---|---|
blive indexeret af ikke-integer | Nej | Nej | Ja |
bevar element orden | Ja | Nej | Nej |
gemmes i databasen | Ja | Ja | Nej |
have elementer hentet individuelt i databasen | Ja | Ja | -- |
have elementer opdateret individuelt i databasen | Ja | Nej | -- |
Herudover kan følgende refereres til, når du skal bestemme hvilken collection der passer best til løsningen:
Varray
- Benyt for at bevare en ordnet liste
- Benyt til arbejde med faste set, med en kendt antal elementer
- Benyt når du vil gemme til databasen og arbejde med din collection som en helhed
Nested Table
- Benyt når du arbejder med ukendste liste størrelser hvor der er behov for udvidelse dynamisk.
- Benyt når du vil gemme til databasen og arbejde på elementerne individuelt
Associative Array
- Benyt når der intet behov for at gemme til databasen er. De er hurtige og flexible og ideele til interne PLSQL applikations brug.
Konklution
Vi har nu fået kigget på Nested tables, Varrays og sidst Associative Arrays, som er en del at de nye ting der er kommet til programmerings sproget PLSQL, over de seneste par år. Ligesom med mange andre programmeringssprog har vi mulighed for at maximere effiktiviteten samtidigt med at det komplexe minimeres.
Da PLSQL er en del af databasen, kan man som programmør godt falde i vandet og blot skrive sine SQL udtryk, og sin kode uden at tænke særligt over det ikke er særligt effektivt. Med introduktionen og den videre udbyggelse af collections, er vi dog der, hvor: Hvis du ikke benytter disse stærke features, vil det kunne ses med det samme, da din kode er den langsomeste der kører i produktion.