Commençons par les tableaux imbriqués, ils sont la forme de collecte la plus courante et représentent donc une base de comparaison utile.
Une table imbriquée est une variable qui peut contenir plus d'une instance de quelque chose, souvent un enregistrement d'une table de base de données. Ils peuvent être déclarés comme ceci :
type emp_nt is table of emp%rowtype;
emp_rec_nt emp_nt;
Ils sont utiles chaque fois que nous voulons stocker plusieurs instances de données sur lesquelles nous voulons faire la même chose. L'exemple classique utilise BULK COLLECT pour stocker plusieurs enregistrements :
select *
bulk collect into emp_rec_nt
from employees;
Cela nous donne une source de données que nous pouvons boucler; surtout, nous pouvons naviguer vers l'arrière et vers l'avant, même sauter à la fin ou au début, ce que nous ne pouvons pas faire avec un curseur. Les tables imbriquées peuvent être des collections de n'importe quel type de données, y compris des composites tels que des enregistrements PL/SQL ou des types définis par l'utilisateur.
Une table Index By est mieux appelée (comme le font les docs) un Associative Array . Ce sont de simples collections d'attributs uniques avec un indice. Les tables imbriquées ont également des index, mais leurs index ne sont que des nombres de lignes. Avec un tableau associatif, l'index peut être significatif, c'est-à-dire provenir d'une valeur de données. Ils sont donc utiles pour mettre en cache des valeurs de données pour une utilisation ultérieure. L'index peut être un nombre, ou (depuis 9iR2) une chaîne qui peut être très utile. Par exemple, voici un tableau associatif de salaires qui est indexé par l'identifiant de l'employé.
type emp_sal_aa is table of emp.sql%type
index by emp.empno%type;
l_emp_sales emp_sal_aa;
Notez que j'aurais pu déclarer ce tableau en utilisant INDEX BY BINARY_INTEGER mais il est plus clair d'utiliser la syntaxe %TYPE à la place (code auto-documenté). Les éléments de ce tableau peuvent être identifiés par une valeur d'index, dans ce cas EMPNO :
l_emp_sals(l_emp_no) := l_emp_sal;
À part la mise en cache des tables de référence ou des valeurs de recherche similaires, il n'y a pas beaucoup de cas d'utilisation pour les tableaux associatifs.
Les tableaux de variables ne sont que des tableaux imbriqués avec une limite prédéfinie sur le nombre d'éléments. Alors peut-être que le nom est trompeur :ce sont en fait des tableaux fixes. Il y a peu de choses que nous pouvons faire avec les VArrays que nous ne pouvons pas faire avec les tables imbriquées (sauf limiter le nombre d'éléments et il est assez rare que nous voudrions le faire). Ils sont déclarés comme ceci :
type emp_va is varray(14) of emp%rowtype;
emp_rec_va emp_va;
Nous pouvons utiliser la collecte en bloc pour remplir un VArray ...
select *
bulk collect into emp_rec_va
from employees;
Cependant, nous devons être certains que la requête renverra au plus le nombre d'éléments spécifiés dans la déclaration du VArray. Sinon, le SELECT lancera ORA-22165.
Il n'existe aucun cas d'utilisation connu pour les tableaux de variables. D'accord, c'est un peu dur, mais presque tout le temps, vous utiliserez des tables imbriquées à la place. Le gros avantage des VArrays par rapport aux tables imbriquées est qu'ils garantissent l'ordre des éléments. Donc, si vous devez obtenir des éléments dans le même ordre que vous les avez insérés, utilisez un VArray.
La documentation PL/SQL consacre un chapitre entier aux collections. En savoir plus.