Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser la clause de collecte en bloc avec l'instruction SELECT INTO dans la base de données Oracle

Clause de collecte groupée avec instruction SELECT INTO

Bienvenue dans le deuxième tutoriel de la série PL/SQL Bulk Collect où nous apprendrons à utiliser la clause BULK COLLECT avec l'instruction SELECT-INTO.

Les commutateurs de contexte sont bons, mais seulement lorsqu'ils sont peu nombreux. L'augmentation du nombre de changements de contexte peut entraîner des problèmes tels que des performances de requête médiocres. Cette surcharge causée par les changements de contexte pourrait facilement être contrôlée si nous pouvons les compresser. C'est exactement ce que vous allez apprendre dans ce tutoriel.

Vous pouvez en savoir plus sur SELECT-INTO ici .

Quand devrions-nous utiliser Bulk Collect avec l'instruction Select-Into ?

Lorsque vous êtes certain que le résultat renvoyé par votre instruction SELECT est petit alors vous devez utiliser la clause Bulk Collect avec l'instruction Select-Into. Sinon, votre clause de collecte en masse fera de votre instruction Select-Into un monstre gourmand en mémoire. Par conséquent, cela ralentira les performances de votre base de données.

Que dois-je faire si mon instruction SELECT récupère un grand nombre de lignes ?

Vous pouvez toujours utiliser la clause LIMIT avec Bulk Collect pour limiter le nombre de lignes extraites de la base de données. Mais cela n'est possible que lorsque nous utilisons la clause Bulk Collect avec des curseurs PL/SQL. Néanmoins, nous en discuterons en détail dans le prochain tutoriel.

Pourquoi ne pouvons-nous pas limiter les données récupérées à l'aide de Bulk Collect dans l'instruction SELECT-INTO ?

Lorsque nous utilisons la clause Bulk Collect avec l'instruction SELECT-INTO, elle utilise implicite curseur pour effectuer la tâche de traitement de données en bloc. Cependant, la clause Limit ne peut être utilisée qu'avec la clause Bulk Collect, lorsque cette dernière utilise le curseur explicite pour le traitement des données.

Quand la clause de collecte en masse utilise-t-elle un curseur implicite et quand un curseur explicite ?

Si nous utilisons Bulk Collect Clause avec une instruction SQL telle que SELECT-INTO, elle utilise un curseur implicite. D'autre part, chaque fois que nous utilisons la clause Bulk Collect avec l'instruction FETCH, elle utilise un curseur explicite.

Je vous suggère de lire comment créer un curseur explicite pour en savoir plus sur l'instruction FETCH.

Pouvons-nous stocker le résultat renvoyé par la clause de collecte en bloc dans une variable de type de données primitif ?

Non, à l'heure actuelle, les collections PL/SQL sont les seuls types de données pris en charge pour le traitement de données en masse avec la clause de collecte en masse dans la base de données Oracle. Si vous essayez de stocker les données récupérées à l'aide de la clause Bulk Collect dans une variable de type de données telle que Char, Number ou Varchar2, vous obtiendrez une erreur qui ressemblera à ceci :

"PLS-00497 :Impossible de mélanger entre une seule ligne et plusieurs lignes (BULK) dans la liste INTO"

Définition de la collecte groupée dans une déclaration
L'instruction "Bulk Collect Into" sélectionne plusieurs données dans une colonne et les stocke dans une collection SQL.

Syntaxe de la clause Bulk Collect avec l'instruction Select-Into.

La syntaxe pour utiliser PL/SQL Bulk Collect Clause avec l'instruction Select-Into dans Oracle Database est la suivante :

SELECT column_list
 BULK COLLECT INTO collection_datatype_name 
FROM table_name 
WHERE <where clause> 
ORDER BY <column list>;

Où :

Liste des colonnes est la liste des colonnes dont vous souhaitez récupérer les données.

Nom du type de données de la collection sera le nom de la variable de collection qui contiendra les données renvoyées par la clause de collecte en masse.

De plus, rappelez-vous toujours que chaque colonne que vous avez spécifiée pour récupérer les données doit contenir un type de données de collection correspondant pour contenir ces données. Parce que le moteur d'exécution PL/SQL stocke toujours les données extraites de la colonne dans la collection de manière parallèle.

Par exemple

SELECT column_1, column_2 BULK COLLECT INTO collection_1, collection2 FROM table;

Ici, les données extraites de la colonne_1 seront automatiquement stockées dans la collection_1 et les données de la colonne_2 dans la collection_2.

Nom du tableau peut être le nom de n'importe quelle table à partir de laquelle vous souhaitez récupérer les données.

Ensuite, nous avons les clauses WHERE et ORDER BY qui sont facultatives mais si vous le souhaitez, vous pouvez les utiliser.

Maintenant que nous avons discuté de la syntaxe, prenons un exemple simple pour apprendre à utiliser la clause PL/SQL Bulk Collect avec l'instruction SELECT INTO dans Oracle Database.

SET SERVEROUTPUT ON;
DECLARE
    TYPE nt_fName   IS TABLE OF VARCHAR2 (20);
    TYPE nt_lName   IS TABLE OF VARCHAR2 (20);
    
    fname   nt_fName;
    lName   nt_lName;
BEGIN
    SELECT first_name, last_name 
        BULK COLLECT INTO fName, lName 
    FROM employees; 
        
        --Print values from the collection--
    FOR idx IN 1..fName.COUNT
    LOOP
        DBMS_OUTPUT.PUT_LINE (idx||' - '||fName (idx) ||' '||lName (idx));
    END LOOP;
END;
/

Explication de l'exemple

Ici, nous avons un code très simple pour montrer comment utiliser Bulk Collect Clause avec l'instruction Select-Into. Dans la section de déclaration de ce code, nous avons d'abord créé deux collections de type Table imbriquée "nt_fName" &"nt_lName" avec leurs variables de collection correspondantes "fName" &"lName". En fait, ces deux collections seront utilisées pour contenir les données renvoyées par l'instruction Select-Into.

Vous pouvez lire comment créer un tableau imbriqué ici.

Dans la section de déclaration, nous avons notre instruction Select-Into avec la clause Bulk Collect. De plus, en utilisant cette instruction Select-Into, nous récupérons toutes les données de la colonne Prénom et Nom de la table des employés. Et avec l'aide de la clause Bulk Collect, nous stockons ces données dans les collections correspondantes en parallèle.

Sauf avec l'instruction Select-Into, nous avons également une "boucle For" qui imprime les données des deux collections sur l'écran de sortie.

À regarder
Assurez-vous de regarder la vidéo où j'ai montré comment Bulk Collect Clause comprime plusieurs commutateurs de contexte en un seul et améliore les performances de la requête. Voici le lien.

Il s'agit du didacticiel expliquant en détail les concepts de la clause Bulk Collect avec l'instruction Select-Into. Dans ce didacticiel, j'ai essayé de répondre à toutes les questions possibles auxquelles vous pourriez être confronté lors de votre examen de certification ainsi que lors de l'entretien.

J'espère que vous avez apprécié la lecture. Assurez-vous de PARTAGER ce blog avec vos amis sur vos réseaux sociaux. Merci et bonne journée !