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

Instruction FORALL avec clause liée INDICES-OF dans la base de données Oracle

Pourquoi FORALL Statement With INDICES OF Bound Clause ?

L'instruction FORALL avec la clause Lower &Upper Bound est probablement le moyen le plus simple de traiter des données en bloc jusqu'à ce que nous fassions référence à une collection dense. En ce qui concerne la collecte clairsemée, la clause Lower &Upper Bound n'est pas solide. De plus, malheureusement, dans un scénario réel, les chances de travailler avec une collection dense sont bien moindres que de travailler avec une collection clairsemée.

Quoi qu'il en soit, si vous êtes curieux, nous avons fait une démonstration. Découvrez ce qui se passe lorsque nous utilisons la clause de limite inférieure et supérieure de l'instruction FORALL avec une collection clairsemée dans la vidéo sur notre chaîne YouTube ici.

Le défaut de la clause de limite inférieure et supérieure de l'instruction FORALL est qu'elle ne peut pas être utilisée avec une collection clairsemée. Cette lacune peut facilement être surmontée en utilisant des options telles que 'Indices-of ' ou 'Valeurs-de ’ clause liée. Ce didacticiel concerne la première option.

Clause INDICES-OF Bound

Semblable à la clause de limite inférieure et supérieure La clause INDICES-OF nous aide dans le traitement de données en masse en nous permettant de parcourir la collection. La seule différence est qu'en utilisant la clause INDICES OF, nous pouvons parcourir une collection aussi bien dense qu'éparse. Alors que la clause de limite inférieure et supérieure ne fonctionne qu'avec une collection dense.

Syntaxe de la clause liée INDICES OF

FORALL index IN INDICES OF collection_variable
[SAVE EXCEPTION]
DML statements; 

Où :

POUR TOUS est un mot-clé réservé à Oracle Database suivi d'un Index. Cet index est un compteur de boucle implicitement défini qui est déclaré par le moteur PL/SQL. Après cela, vous devez écrire un autre mot-clé qui est IN. Suivi du mot-clé IN, nous avons notre clause liée qui est INDICES OF.

Juste après avoir écrit la phrase réservée 'INDICES OF', nous devons spécifier la variable de collection de la collection dont nous voulons utiliser les données. Nous savons déjà que nous avons référencé la collection dans le programme via sa variable de collection. Ensuite, nous avons l'option SAVE EXCEPTION, c'est un choix facultatif. Ensuite, nous avons une instruction DML qui peut être n'importe quelle instruction DML ou une instruction MERGE.

Assurez-vous que l'instruction DML ou l'instruction MERGE que vous utilisez avec FORALL doit faire référence à une collection. De plus, une instruction FORALL ne peut traiter qu'une seule instruction DML ou MERGE à la fois.

Exemple de clause liée INDICES OF

Ici, nous verrons une démonstration de la clause liée INDICES OF avec l'instruction FORALL. Ici, nous allons récupérer les données d'une table imbriquée clairsemée déjà initialisée et les stocker dans une table.

Comme nous l'avons appris dans le didacticiel précédent, l'instruction FORALL prend les données de la collection et les stocke dans une table. Ainsi, nous allons d'abord créer un tableau.

SET SERVEROUTPUT ON;
CREATE TABLE tut_78(
    mul_tab NUMBER(5)
);

Afin de faciliter la démonstration, nous avons créé une table très simple avec le nom tut_78. Cette table n'a qu'une seule colonne mul_tab de type de données NUMBER.

DECLARE
    TYPE my_nested_table IS TABLE OF number;
    var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90);
    --Another variable for holding total number of record stored into the table 
    tot_rec NUMBER;
BEGIN
    var_nt.DELETE(3, 6);
    
    FORALL idx IN INDICES OF var_nt
        INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx));
        
    SELECT COUNT (*) INTO tot_rec FROM tut_78;
    DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec);
END;
/

Vous pouvez trouver l'explication détaillée du code ci-dessus dans le didacticiel vidéo. Mais ayons encore une explication rapide ici aussi.

Section de déclaration du bloc PL/SQL ci-dessus

Ici, dans cette section, nous avons d'abord créé une table imbriquée avec le nom "my_nested_table '. Il contient les données du type de données NUMBER. Ensuite, nous avons déclaré sa variable de collection ‘var_nt '. En l'utilisant, nous avons initialisé les 10 premiers index en stockant 10 éléments numériques dans notre collection.

Outre Nested Table et sa variable de collection, nous avons également déclaré une variable supplémentaire 'tot_rec ' du type de données nombre. Cette variable sera utilisée pour contenir le nombre total de données qui seront stockées dans la table.

Section d'exécution

Si vous regardez la première déclaration dans la section d'exécution. Vous constaterez qu'en utilisant la méthode de collecte DELETE, j'ai supprimé des données de l'index 3 à l'index 6. Cela signifie que l'index de notre collection n'est plus rempli de manière séquentielle. Cela change la nature de notre collection de DENSE à SPARSE.

Juste après l'appel DELETE de la méthode de collecte, nous avons notre instruction FORALL avec la clause liée INDICES OF. En utilisant cette déclaration, nous insérons dans la collection "my_nested_table" dans la table tut_78.

Ensuite, nous avons une instruction SELECT-INTO. Cette instruction renvoie le nombre total de lignes insérées dans la table tut_78 et stocke cette valeur dans la variable tot_rec. Ensuite, en utilisant l'instruction DBMS_OUTPUT, nous affichons la valeur stockée dans la variable tot_rec avec une chaîne formatée à l'utilisateur.

Je vous suggère fortement de regarder ce tutoriel sur ma chaîne YouTube pour une explication approfondie du code décrit ci-dessus. N'oubliez pas non plus de vous abonner à la chaîne pour des tutoriels plus intéressants.

Merci, c'est un tutoriel PL/SQL sur la façon d'effectuer un traitement de données en masse à l'aide de l'instruction FORALL avec la clause liée INDICES OF. J'espère que vous avez apprécié la lecture, si c'est le cas, partagez ce blog sur vos réseaux sociaux. Bonne journée !