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.