
Les collections PL/SQL sont des structures qui stockent plusieurs valeurs dans une seule variable — l’équivalent des tableaux et listes en SQL Oracle. Il en existe trois types : les tableaux associatifs, les VARRAY et les nested tables. Ce guide explique quand utiliser chacun, avec des exemples clairs.
🧪 Envie de pratiquer ? Exécutez les exemples de cet article dans notre SQL Playground gratuit — aucun logiciel à installer.
Les 3 types de collections en un coup d’œil
| Type | Indice | Taille | Usage typique |
|---|---|---|---|
| Tableau associatif (INDEX BY) | entier ou chaîne | illimitée, creuse | en mémoire, le plus courant |
| VARRAY | entier consécutif | bornée (max fixé) | petites listes ordonnées |
| Nested table | entier | illimitée | stockable en colonne |
1. Le tableau associatif (le plus utilisé)
DECLARE
TYPE t_noms IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
v_noms t_noms;
BEGIN
v_noms(1) := 'Durand';
v_noms(2) := 'Martin';
DBMS_OUTPUT.put_line(v_noms(2)); -- Martin
DBMS_OUTPUT.put_line(v_noms.COUNT); -- 2
END;Indexable par chaîne (très pratique comme « dictionnaire ») :
TYPE t_prix IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
v_prix('pomme') := 1.20;⚠️ Le tableau associatif vit uniquement en mémoire (pas stockable en colonne).
2. Le VARRAY (taille bornée)
DECLARE
TYPE t_top3 IS VARRAY(3) OF VARCHAR2(50);
v_top t_top3 := t_top3('Or', 'Argent'); -- initialisation
BEGIN
v_top.EXTEND; -- agrandir
v_top(3) := 'Bronze';
DBMS_OUTPUT.put_line(v_top.COUNT); -- 3
END;Idéal quand le nombre d’éléments est petit et connu (jours de la semaine, podium…).
3. La nested table
DECLARE
TYPE t_ids IS TABLE OF NUMBER;
v_ids t_ids := t_ids();
BEGIN
v_ids.EXTEND(2);
v_ids(1) := 10; v_ids(2) := 20;
END;Une nested table peut être déclarée au niveau SQL (CREATE TYPE) et stockée dans une colonne de table.
Remplir une collection depuis une requête : BULK COLLECT
DECLARE
TYPE t_clients IS TABLE OF clients%ROWTYPE;
v_clients t_clients;
BEGIN
SELECT * BULK COLLECT INTO v_clients FROM clients WHERE ville = 'Paris';
FOR i IN 1 .. v_clients.COUNT LOOP
DBMS_OUTPUT.put_line(v_clients(i).nom);
END LOOP;
END;C’est la façon performante de charger des lignes en mémoire — détails dans notre guide BULK COLLECT & FORALL.
Les méthodes de collection indispensables
COUNT: nombre d’élémentsFIRST/LAST: premier / dernier indiceNEXT(i)/PRIOR(i): parcourir une collection creuseEXTEND: ajouter des éléments (VARRAY / nested table)DELETE: supprimer un élémentEXISTS(i): tester la présence d’un indice
-- parcours sûr d'une collection creuse
i := v_noms.FIRST;
WHILE i IS NOT NULL LOOP
DBMS_OUTPUT.put_line(v_noms(i));
i := v_noms.NEXT(i);
END LOOP;Quel type choisir ?
- Traitement en mémoire (le cas courant) → tableau associatif.
- Petite liste bornée et ordonnée → VARRAY.
- À stocker en base / passer en SQL → nested table (type SQL).
FAQ
Quelle est la collection la plus utilisée en PL/SQL ?
Le tableau associatif (INDEX BY) : simple, illimité, parfait pour les traitements en mémoire et le combo BULK COLLECT.
Pourquoi « ORA-06531: reference to uninitialized collection » ?
Les VARRAY et nested tables doivent être initialisés avec leur constructeur (t_ids()) puis étendus (EXTEND) avant affectation. Le tableau associatif, lui, n’a pas besoin d’initialisation.
Peut-on stocker une collection dans une colonne ?
Oui, avec une nested table ou un VARRAY définis au niveau SQL (CREATE TYPE). Pas avec un tableau associatif (mémoire uniquement).
