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

Formål med at bruge forskellige typer PL/SQL-samlinger i Oracle

Lad os starte med indlejrede tabeller, de er den mest almindelige form for indsamling og repræsenterer derfor et nyttigt sammenligningsgrundlag.

En indlejret tabel er en variabel, der kan indeholde mere end én forekomst af noget, ofte en post fra en databasetabel. De kan blive erklæret sådan her:

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

De er nyttige, når vi vil gemme flere forekomster af data, som vi ønsker at gøre det samme mod. Det klassiske eksempel er at bruge BULK COLLECT til at gemme flere poster:

select * 
bulk collect into emp_rec_nt
from employees;

Dette giver os en kilde til data, vi kan sløjfe rundt; Det er afgørende, at vi kan navigere baglæns såvel som fremad, endda springe til slutningen eller begyndelsen, hvilket er ting, vi ikke kan gøre med en markør. Indlejrede tabeller kan være samlinger af enhver datatype, inklusive kompositter såsom PL/SQL-poster eller brugerdefinerede typer.

En Index By-tabel kaldes bedre (som dokumenterne gør) en Associative Array . Disse er simple samlinger af enkelte attributter med et indeks. Indlejrede tabeller har også indekser, men deres indekser er kun rækketællinger. Med et associativt array kan indekset være meningsfuldt, dvs. hentet fra en dataværdi. Så de er nyttige til at cache dataværdier til senere brug. Indekset kan være et tal eller (siden 9iR2) en streng, som kan være meget nyttig. For eksempel er her en associativ matrix af lønninger, som er indekseret af medarbejder-id'et.

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

Bemærk, at jeg kunne have erklæret det array ved hjælp af INDEX BY BINARY_INTEGER, men det er klarere at bruge %TYPE-syntaksen i stedet for (selvdokumenterende kode). Elementer i det array kan identificeres med en indeksværdi, i dette tilfælde EMPNO:

l_emp_sals(l_emp_no) := l_emp_sal;

Bortset fra cache-referencetabeller eller lignende opslagsværdier er der ikke mange use cases for associative arrays.

Variable arrays er blot indlejrede tabeller med en foruddefineret grænse for antallet af elementer. Så måske er navnet misvisende:de er faktisk faste arrays. Der er lidt, vi kan gøre med VARrays, som vi ikke kan gøre med indlejrede tabeller (bortset fra at begrænse antallet af elementer, og det er ret sjældent, at vi ønsker at gøre det). De erklæres således:

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

Vi kan bruge masseindsamling til at udfylde en VARray ...

select * 
bulk collect into emp_rec_va
from employees;

Vi skal dog være sikre på, at forespørgslen højst vender tilbage antallet af elementer specificeret i VARray's erklæring. Ellers vil SELECT kaste ORA-22165.

Der er ingen kendte use cases for variable arrays. Okay, det er lidt hårdt, men næsten hele tiden vil du bruge indlejrede tabeller i stedet for. Den ene store fordel ved VARrays i forhold til indlejrede tabeller er, at de garanterer rækkefølgen af ​​elementerne. Så hvis du skal få elementer ud i samme rækkefølge som du indsatte dem, brug en VARray.

PL/SQL-dokumentationen afsætter et helt kapitel til samlinger. Få mere at vide.



  1. SQL rækker til kolonner

  2. Hvad er forskellen mellem Scope_Identity(), Identity(), @@Identity og Ident_Current()?

  3. Sådan ændres en standard MySQL/MariaDB-datakatalog i Linux

  4. Konverter NULL-værdier til kolonnens standardværdi ved indsættelse af data i SQLite