Les collections PL/SQL Oracle : VARRAY, nested table, tableau associatif

Les collections PL/SQL Oracle expliquées : tableau associatif, VARRAY, nested table, BULK COLLECT et méthodes (COUNT, EXTEND…), avec exemples clairs.

Illustration : les collections PL/SQL Oracle

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.

Publicité

🧪 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

TypeIndiceTailleUsage typique
Tableau associatif (INDEX BY)entier ou chaîneillimitée, creuseen mémoire, le plus courant
VARRAYentier consécutifbornée (max fixé)petites listes ordonnées
Nested tableentierillimitéestockable 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éments
  • FIRST / LAST : premier / dernier indice
  • NEXT(i) / PRIOR(i) : parcourir une collection creuse
  • EXTEND : ajouter des éléments (VARRAY / nested table)
  • DELETE : supprimer un élément
  • EXISTS(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).

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →