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

Introduction à l'instruction FORALL dans la base de données Oracle

Traitement de données en masse à l'aide de l'instruction FORALL

Je sais que le didacticiel précédent était une pause rapide de notre série Bulk Collect. Après tout, c'était la demande du public et nous avions l'obligation de la remplir. Mais ne vous inquiétez pas, nous sommes de retour sur la bonne voie. Voyons donc l'introduction au traitement de données en masse à l'aide de l'instruction FORALL dans Oracle Database.

Si vous ne savez pas de quel tutoriel je parle, vérifiez ici. Alors maintenant, venons-en au sujet.

Qu'est-ce qu'une instruction FORALL ?

L'instruction FORALL aide à traiter les données en masse de manière optimisée en envoyant des instructions DML ou une instruction MERGE (si vous utilisez 11g ou supérieur) par lots du moteur PL/SQL au moteur SQL.

Vous pouvez également définir une instruction FORALL en tant que construction de boucle en bloc qui exécute une instruction DML ou une instruction MERGE une ou plusieurs fois à la fois.

La collecte en masse optimise la requête et améliore les performances en réduisant les changements de contexte. FORALL fait la même chose pour les instructions DML telles que Insert, Delete, Update ou pour une instruction MERGE.

Quelle est la syntaxe de l'instruction FORALL ?

La syntaxe est assez simple, jetons un coup d'œil.

FORALL index IN bound_clauses 
[SAVE EXCEPTION]
DML statement;

Où :

POUR TOUS est le mot-clé réservé Oracle.

Index est un compteur de boucle implicitement défini qui est déclaré par le moteur PL/SQL comme PLS_INTEGER. Comme il est implicitement défini par le moteur PL/SQL, vous n'avez donc pas besoin de le définir. La portée d'Index est limitée à l'instruction FORALL dans laquelle il est défini.

Bound_Clauses sont les clauses qui contrôlent le nombre d'itérations de la boucle. De plus, la valeur de l'indice en dépend également. Il existe trois types de clauses liées dans Oracle PL/SQL dont nous parlerons séparément plus tard dans ce didacticiel.

SAUVEGARDER L'EXCEPTION est un choix facultatif qui maintient l'exécution de l'instruction FORALL même lorsque l'instruction DML provoque une exception. Ces exceptions sont enregistrées dans un attribut de curseur appelé SQL%Bulk_Exceptions.

Information :
En raison de SAVE EXCEPTION, l'instruction FORALL ne se ferme pas brusquement même en cas d'exception. C'est un avantage de l'instruction FORALL par rapport à la boucle FOR.

Déclaration DML :L'instruction DML peut être n'importe quelle instruction DML telle que INSERT, UPDATE ou DELETE. Si vous utilisez Oracle 11g ou supérieur, vous pouvez également utiliser l'instruction MERGE avec FORALL. Mais vous devez vous assurer que votre instruction DML ou l'instruction MERGE doit faire référence à au moins une collection dans sa clause VALUES ou WHERE.

De plus, contrairement à FOR Loop, avec l'instruction FORALL, nous ne pouvons utiliser qu'un seul DML à la fois. C'est le défaut de FORALL.

FORALL est-il une boucle comme FOR Loop ?

Non, bien que l'instruction FORALL itère sur toutes les lignes d'une collection, mais ce n'est pas une boucle FOR. Si vous avez lu attentivement la syntaxe, vous devez avoir remarqué que, contrairement à "FOR Loop", le bloc de l'instruction FORALL ne commence ni par le mot-clé LOOP ni ne se termine par le mot-clé END LOOP.

Pouvons-nous exécuter Insert et Update DML à la fois en utilisant FORALL ?

Non, malheureusement, contrairement à FOR Loop avec FORALL, nous ne pouvons pas exécuter plus d'un DML à la fois. Cela signifie que vous pouvez exécuter Insert ou Update à la fois et non les deux ensemble. C'est une lacune de l'instruction FORALL.

Qu'est-ce que l'attribut de curseur SQL %Bulk_Exceptions ?

L'attribut de curseur SQL%Bulk_Exceptions est une collection d'enregistrements qui a deux champs Error_Index et Error_Code. Error_Index stocke le nombre d'itérations de l'instruction FORALL au cours desquelles l'exception s'est produite. D'autre part, Error_Code stocke le code d'exception correspondant à l'exception déclenchée.

Pouvons-nous voir le nombre d'exceptions survenues lors de l'exécution de l'instruction FORALL ?

Vous pouvez facilement vérifier combien d'exceptions ont été déclenchées lors de l'exécution de l'instruction FORALL à l'aide de SQL%BULK_EXCEPTION.COUNT.

Quelles sont ces clauses liées ? Dites-nous quelque chose à leur sujet.

Comme mentionné ci-dessus, les clauses Bound contrôlent la valeur de l'index de boucle et le nombre d'itérations de l'instruction FORALL. Il existe trois types de clauses liées qui peuvent être utilisées avec l'instruction FORALL dans Oracle Database. Ce sont :

  1. Limite inférieure et supérieure
  2. Indices de et
  3. Valeurs de

La borne INFÉRIEURE ET SUPÉRIEURE :Semblable à FOR LOOP, dans cette clause liée, vous devez spécifier le début et la fin valides des numéros d'index consécutifs de la collection référencée.

Il est indispensable de spécifier une plage valide de numéros d'index consécutifs avec cette clause liée pour le nombre de collections référencées dans l'instruction DML. Cependant, il existe un risque d'erreur si la collection référencée avec cette clause s'avère clairsemée. L'erreur que vous obtiendrez est la suivante :

ORA-22160: element at index [3] does not exist

Dans le cas où votre collection référencée est clairsemée et que vous utilisez Oracle 10g ou supérieur, vous voudrez peut-être utiliser les deux autres options qui sont, 'Indices-of' et 'Values-of'.

Les INDICES DE :La deuxième clause liée qui nous est disponible est ‘Indices de’. Cette clause liée permet à notre instruction FORALL de parcourir une collection fragmentée telle qu'un tableau associatif ou une table imbriquée.

Lecture suggérée :Introduction à la collection PL/SQL

Les VALEURS DE :La troisième clause liée est Valeurs de. L'option VALUES OF indique clairement que les valeurs des éléments de la collection spécifiée du compteur de boucle constituent la base des valeurs dans l'instruction FORALL. Fondamentalement, cette collection est un groupe d'index que l'instruction FORALL peut parcourir en boucle. De plus, ces index n'ont pas besoin d'être uniques et peuvent être répertoriés dans un ordre arbitraire.

Si vous apprenez plus rapidement en regardant un didacticiel vidéo, voici une explication détaillée de la déclaration FORALL.

Nous apprendrons à utiliser toutes ces clauses liées avec l'instruction FORALL dans les futurs tutoriels, alors restez à l'écoute. Pour la dernière mise à jour, vous pouvez vous abonner à ma chaîne YouTube et me suivre sur mes réseaux sociaux.

Merci et bonne journée !