Oracle Collections PL/SQL : Varrays, imbriqués et indexés par tables

⚡ Résumé intelligent

Les collections PL/SQL sont des groupes ordonnés d'éléments de même type de données, accessibles par un indice. Il en existe trois types : Varray, table imbriquée et table indexée. Ils diffèrent par leur taille (fixe ou non), le fonctionnement des indices et leur possibilité d'être stockés dans la base de données.

  • 🧺 Définition: Une collection contient de nombreux éléments d'un même type, chacun identifié par un indice unique.
  • (I.e. Varray : Taille supérieure fixe, toujours dense, indice numérique, doit être initialisé avant utilisation.
  • 📚 Tableau imbriqué : Aucune limite de taille, peut être dense ou clairsemé, stocké dans une table système, extensible avec EXTEND.
  • (I.e. Table d'indexation : Aucune limite de taille, l'indice peut être une chaîne de caractères ou un entier négatif, non stocké dans la base de données.
  • ???? Constructeur: Les tableaux Varray et les tables imbriquées nécessitent un constructeur explicite pour être initialisés avant d'être référencés.
  • Méthodologie: COUNT, EXISTS, FIRST, LAST, EXTEND, TRIM et DELETE gèrent une collection.
  • | Masse: BULK COLLECT remplit une collection en une seule étape pour un traitement rapide.

Oracle Collections PL/SQL

Qu'est-ce qu'une collecte ?

Une collection est un groupe ordonné d'éléments d'un type de données particulier. Il peut s'agir d'une collection d'un type de données simple ou d'un type de données complexe, comme les types définis par l'utilisateur ou les types d'enregistrement.

Dans une collection, chaque élément est identifié par un terme appelé un "indice." Chaque élément se voit attribuer un indice unique, et les données peuvent être manipulées ou extraites en se référant à cet indice unique.

Les collections sont particulièrement utiles lorsqu'il est nécessaire de traiter ou de manipuler une grande quantité de données du même type. Elles peuvent être remplies et manipulées en bloc à l'aide de l'option « BULK ». Oracle.

Les collections sont classées en fonction de leur structure, de leur indice et de leur mode de stockage, comme indiqué ci-dessous :

  • Tableaux indexés (également appelés tableaux associatifs)
  • Tableaux imbriqués
  • Varrays

À tout moment, les données d'une collection peuvent être désignées par trois termes : le nom de la collection, l'indice et le nom du champ ou de la colonne, comme « ( ). Vous découvrirez ces catégories de collection dans les sections ci-dessous.

Aperçu des types de collections

Les trois types de collections présentent des avantages et des inconvénients différents. Le tableau ci-dessous les compare avant de les examiner en détail.

Aspect Varray Tableau imbriqué Table indexée par
Taille limite supérieure fixe Pas de limite Pas de limite
indice Numérique Numérique Entier ou chaîne de caractères
Densité Toujours dense Dense ou clairsemé Toujours clairsemé
Stocké dans la base de données Oui Oui Non
Nécessite une initialisation Oui Oui Non

Varrays

Un Varray est une collection dont la taille est fixe et ne peut être dépassée. L'indice d'un Varray est une valeur numérique. Les attributs des Varrays sont :

  • La taille limite supérieure est fixe.
  • Remplissage séquentiel commençant par l'indice '1'.
  • Ce type de collection est toujours dense ; il est impossible de supprimer individuellement les éléments du tableau. Un Varray peut être supprimé en totalité ou tronqué à la fin.
  • Du fait de sa densité constante, il est très peu flexible.
  • Cette méthode est plus appropriée lorsque la taille du tableau est connue et que des opérations similaires sont effectuées sur tous les éléments.
  • L'indice et le nombre de titres de la collection restent toujours stables.
  • Elle doit être initialisée avant utilisation. Toute opération autre que EXISTS sur une collection non initialisée génère une erreur.
  • Il peut être créé en tant qu'objet de base de données visible dans toute la base de données, ou à l'intérieur d'un sous-programme pour être utilisé uniquement à cet endroit.

La figure ci-dessous explique l'allocation de mémoire d'un Varray (dense).

indice 1 2 3 4 5 6 7
Valeur Xyz Dfv Sdé Cxs Vbc Mou, tendre Qwe

Syntaxe pour VARRAY :

TYPE <type_name> IS VARRAY (<SIZE>) OF <DATA_TYPE>;
  • Dans la syntaxe ci-dessus, `type_name` est déclaré comme un tableau de type `DATA_TYPE` dont la taille est limitée. Le type de données peut être simple ou complexe.

Tables imbriquées

Un tableau imbriqué est une collection dont la taille des éléments n'est pas fixe. Il possède un type d'indice numérique. Plus d'informations sur le type de tableau imbriqué :

  • La table imbriquée n'a pas de limite de taille supérieure.
  • Comme la limite supérieure n'est pas fixe, la mémoire doit être étendue avant chaque utilisation, à l'aide du mot-clé « EXTEND ».
  • Remplissage séquentiel commençant par l'indice '1'.
  • Ce type de collection peut être à la fois dense et clairsemé; nous pouvons le créer comme dense et aussi supprimer des éléments individuels de manière aléatoire, ce qui le rend clairsemé.
  • Cela offre une plus grande flexibilité pour la suppression des éléments du tableau.
  • Elle est stockée dans une table de base de données générée par le système et peut être utilisée dans une requête de sélection pour récupérer des valeurs.
  • L'indice et le nombre peuvent varier.
  • Elle doit être initialisée avant utilisation. Toute opération autre que EXISTS sur une collection non initialisée génère une erreur.
  • Il peut être créé en tant qu'objet de base de données visible dans toute la base de données, ou à l'intérieur d'un sous-programme pour être utilisé uniquement à cet endroit.

La figure ci-dessous illustre l'allocation mémoire d'une table imbriquée (dense et creuse). Un espace vide représente un élément creux.

indice 1 2 3 4 5 6 7
Valeur (dense) Xyz Dfv Sdé Cxs Vbc Mou, tendre Qwe
Valeur (éparse) Qwe Asd afg Asd Wer

Syntaxe pour la table imbriquée :

TYPE <type_name> IS TABLE OF <DATA_TYPE>;
  • Dans la syntaxe ci-dessus, `type_name` est déclaré comme une collection de tables imbriquées de type `DATA_TYPE`. Le type de données peut être simple ou complexe.

Table indexée par

Une table indexée est une collection dont la taille du tableau n'est pas fixe. Contrairement aux autres types de collections, l'indice d'une table indexée peut être défini par l'utilisateur. Les attributs d'une table indexée sont :

  • L'indice peut être un entier ou une chaîne de caractères. Son type doit être précisé lors de la création de la collection.
  • Ces collections ne sont pas stockées de manière séquentielle.
  • Ils sont toujours de nature clairsemée.
  • La taille du tableau n'est pas fixe.
  • Elles ne peuvent pas être stockées dans une colonne de base de données. Elles sont créées et utilisées au sein d'une session particulière.
  • Ils offrent une plus grande flexibilité dans la gestion de l'indice.
  • Les indices peuvent former une séquence négative.
  • Elles sont plus appropriées pour des valeurs de collecte relativement faibles utilisées au sein du même sous-programme.
  • Il n'est pas nécessaire de les initialiser avant utilisation.
  • Ils ne peuvent pas être créés en tant qu'objet de base de données ; ils sont créés uniquement à l'intérieur d'un sous-programme.
  • L'option BULK COLLECT ne peut pas être utilisée avec ce type de collection, car l'indice doit être spécifié explicitement pour chaque enregistrement.

La figure ci-dessous illustre l'allocation mémoire d'une table indexée (causée). Un espace vide représente un élément creux.

Indice (varchar) PREMIERE DEUXIÈME TROISIÈME QUATRIÈME CINQUIÈME SIXIÈME SEPTIÈME
Valeur (éparse) Qwe Asd afg Asd Wer

Syntaxe pour un tableau indexé par :

TYPE <type_name> IS TABLE OF <DATA_TYPE> INDEX BY VARCHAR2 (10);
  • Dans la syntaxe ci-dessus, `type_name` est déclarée comme une collection de tables indexées de type `DATA_TYPE`. La variable d'indice est de type `VARCHAR2` avec une taille maximale de 10.

Constructeur et concept d'initialisation dans les collections

Les constructeurs sont des fonctions intégrées fournies par Oracle qui portent le même nom que l'objet ou la collection. Elles sont exécutées en premier lorsqu'un objet ou une collection est référencé pour la première fois dans une session. Détails importants concernant un constructeur dans le contexte d'une collection :

  • Pour les collections, ces constructeurs doivent être appelés explicitement pour initialiser la collection.
  • Les tableaux Varray et les tables imbriquées doivent être initialisés via ces constructeurs avant d'être utilisés dans le programme.
  • Un constructeur étend implicitement l'allocation de mémoire pour une collection (sauf Varray), il peut donc également assigner des variables à la collection.
  • L'affectation de valeurs via des constructeurs ne rend jamais la collection clairsemée.

Méthodes de collecte

Oracle Ce module offre de nombreuses fonctions pour manipuler et gérer les collections. Ces fonctions déterminent et modifient les différents attributs d'une collection. Le tableau ci-dessous présente ces fonctions et leur description.

Méthode Description Syntaxe
EXISTE (n) Renvoie un résultat booléen. Renvoie VRAI si le n-ième élément existe, sinon FAUX. Seule la méthode EXISTS peut être utilisée sur une collection non initialisée. .EXISTE(élément_position)
COUNT Donne le nombre total d'éléments présents dans une collection. .COMPTER
LIMIT Renvoie la taille maximale de la collection. Pour les tableaux de type Varray, renvoie la taille fixe ; pour les tables imbriquées et indexées, renvoie NULL. .LIMITE
PREMIERE Renvoie la valeur du premier indice de la collection. .D'ABORD
DERNIER Renvoie la valeur du dernier indice de la collection. .DERNIER
ANTÉRIEUR (n) Renvoie l'indice précédent du n-ième élément. Si aucun indice n'est renseigné, NULL est renvoyé. .PRIOR(n)
SUIVANT (n) Renvoie l'indice suivant du n-ième élément. Si aucun indice n'est renseigné, NULL est renvoyé. .SUIVANT(n)
ÉTENDRE Ajoute un élément à la fin d'une collection. .ÉTENDRE
PROLONGER (n) Ajoute n éléments à la fin d'une collection. .EXTEND(n)
PROLONGER (n,i) Étend n copies du ième élément à la fin de la collection. .EXTEND(n,i)
TRIM Supprime un élément de la fin de la collection. .GARNITURE
GARNITURE (n) Supprime n éléments de la fin de la collection. .TRIM (n)
EFFACER Supprime tous les éléments de la collection, la vidant ainsi. .SUPPRIMER
SUPPRIMER (n) Supprime le n-ième élément. Si le n-ième élément est NULL, ne fait rien. .DELETE(n)
SUPPRIMER (m,n) Supprime les éléments de la plage mth à nth dans la collection. .DELETE(m,n)

Exemple 1 : Type d’enregistrement au niveau du sous-programme

Dans cet exemple, nous voyons comment remplir la collection en utilisant 'COLLECTE EN VRAC« et comment faire référence aux données collectées. »

Exemple de collection PL/SQL remplie avec BULK COLLECT

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER
);
TYPE emp_det_tbl IS TABLE OF emp_det;
guru99_emp_rec emp_det_tbl:= emp_det_tbl();
BEGIN
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1000,'AAA',25000,1000);
INSERT INTO emp (emp_no,emp_name, salary, manager) VALUES (1001,'XXX',10000,1000);
INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000);
INSERT INTO emp (emp_no,emp_name,salary, manager) VALUES (1003,'ZZZ',7500,1000);
COMMIT;
SELECT emp_no,emp_name,manager,salary BULK COLLECT INTO guru99_emp_rec
FROM emp;
dbms_output.put_line ('Employee Detail');
FOR i IN guru99_emp_rec.FIRST..guru99_emp_rec.LAST
LOOP
dbms_output.put_line ('Employee Number: '||guru99_emp_rec(i).emp_no);
dbms_output.put_line ('Employee Name: '||guru99_emp_rec(i).emp_name);
dbms_output.put_line ('Employee Salary:'|| guru99_emp_rec(i).salary);
dbms_output.put_line('Employee Manager Number:'||guru99_emp_rec(i).manager);
dbms_output.put_line('--------------------------------');
END LOOP;
END;
/

Code Explication

  • Code lignes 2-8 : Type d'enregistrement 'emp_det' est déclaré avec des colonnes emp_no, emp_name, manager et salary de type de données NUMBER, VARCHAR2, NUMBER et NUMBER.
  • Code ligne 9: Création de la collection 'emp_det_tbl' de l'élément de type enregistrement 'emp_det'.
  • Code ligne 10: Déclarer la variable 'guru99_emp_rec' comme étant de type 'emp_det_tbl' et l'initialiser avec un constructeur nul.
  • Code lignes 12-15 : Insertion des exemples de données dans la table 'emp'.
  • Code ligne 16: Validation de la transaction d'insertion.
  • Code ligne 17: Récupération des enregistrements de la table « emp » et remplissage en masse de la variable de collection à l'aide de « BULK COLLECT ». La variable « guru99_emp_rec » contient désormais tous les enregistrements présents dans la table « emp ».
  • Code lignes 19-26 : La boucle « FOR » est configurée pour afficher tous les enregistrements de la collection un par un. Les méthodes de collection FIRST et LAST sont utilisées comme limites inférieure et supérieure de la collection. boucle.

Sortie : Lorsque le code ci-dessus est exécuté, vous obtenez le résultat suivant.

Employee Detail
Employee Number: 1000
Employee Name: AAA
Employee Salary: 25000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1001
Employee Name: XXX
Employee Salary: 10000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1002
Employee Name: YYY
Employee Salary: 15000
Employee Manager Number: 1000
----------------------------------------------
Employee Number: 1003
Employee Name: ZZZ
Employee Salary: 7500
Employee Manager Number: 1000
----------------------------------------------

FAQ

Un tableau Varray a une taille maximale fixe et est toujours dense. Une table imbriquée n'a pas de limite de taille, peut être creuse et extensible, ce qui la rend plus flexible pour les données évolutives ou lacunaires.

Il s'agit d'un tableau associatif en mémoire, et non d'une table stockée. L'indice sert de clé de recherche ; une chaîne de caractères ou un entier négatif conviennent donc, ce qui est utile pour les recherches par clé au sein d'une session.

Un tableau Varray ou une table imbriquée non initialisée est atomiquement nul ; par conséquent, toute référence à un élément génère une erreur. L’appel au constructeur alloue la mémoire, après quoi les méthodes EXTEND et les affectations permettent d’ajouter des données.

Oui. Selon que la taille soit fixe, que les données soient stockées et qu'une clé de type chaîne soit nécessaire, l'IA peut indiquer s'il s'agit d'un Varray, d'une table imbriquée ou d'une table indexée et expliquer le compromis.

BULK COLLECT charge toutes les lignes dans une collection en un seul changement de contexte entre les moteurs SQL et PL/SQL, au lieu d'un changement par ligne, ce qui réduit considérablement la surcharge sur les grands ensembles de résultats.

Résumez cet article avec :