La boucle FOR

La boucle FOR est sans doute la boucle la plus importante implémentée dans PL/PgSQL. Utilisez la boucle theFOR pour itérer un bloc d’instructions sur une plage d’entiers que vous spécifiez. La structure d’une boucle FOR dans PL / PgSQL est similaire à FORloops dans d’autres langages procéduraux, tels que C.

Dans une boucle FOR PL / PgSQL, une variable entière est d’abord indiquée, pour suivre l’itération de la boucle, puis la plage entière est donnée et enfin un bloc d’instructions est fourni. La variable entière créée pour effectuer l’itération de la boucle est détruite une fois la boucle terminée ; elle n’a pas besoin d’être déclarée dans la section de déclaration du bloc. Ce qui suit montre la syntaxe de la boucle FOR:

 FOR identifier IN expression1 .. expression2 LOOP statement; END LOOP;

La boucle FOR effectuera une seule itération pour chaque valeur incrémentée d’identificateur qui se trouve dans la plage de valeurs entre, et incluant, expression1 et expression2. La valeur de l’identifiant sera initialisée à la valeur deexpression 1, quels que soient les paramètres antérieurs, et incrémentée d’un à chaque itération. IfREVERSE est spécifié, l’identifiant sera décrémenté plutôt qu’incrémenté.

Remarque: L’identifiant utilisé pour suivre l’itération n’a pas besoin d’être déclaré en dehors du bloc theFOR, sauf si vous souhaitez pouvoir accéder à sa valeur après la fin de la boucle.

La boucle FOR peut également être utilisée pour parcourir les résultats d’une requête. La deuxième boucle FOR de l’exemple 11-45 montre l’utilisation d’une boucle aFOR pour travailler avec des variables RECORD et %ROWTYPE. La syntaxe d’une boucle FOR qui passe par les variables RECORD et %ROWTYPE est présentée dans la syntaxe suivante:

 FOR { record_variable | %rowtype_variable } IN select_statement LOOP statement; END LOOP;

Dans l’exemple 11-45, la fonction extract_all_titles() est utilisée pour extraire une liste de tous les titres de livres qui existent dans la base de données, organisée par sujet. Lorsqu’un sujet n’a pas de titre de livre, la ligne ablank s’affiche. La liste est renvoyée sous forme de variable de texte. Une boucle FOR est utilisée dans la fonction extract_all_titles() pour parcourir les objets disponibles par numéro.

Une autre boucle FOR est imbriquée dans la boucle d’origine pour parcourir les livres disponibles et récupérer tous les livres avec des valeurs subject_id qui correspondent à la variable d’écriture de la boucle d’origine, qui représente le numéro d’identification du sujet actuel recherché par la fonction. Dans l’exemple 11-45, la variable d’itération i est initialisée à zéro car le premier numéro d’identification de sujet dans notre table de sujets est 0.

L’exemple 11-46 montre le code d’une autre fonction qui utilise la boucle aFOR pour parcourir les résultats d’une requête SQL. À chaque itération de la boucle, la boucle FOR de l’exemple 11-46 place le contenu d’une ligne de résultat d’une requête sur la table books dans la variable row_data, puis insère la valeur du champ de titre de la ligne dans la variable thetext_output.

La boucle se termine lorsque le dernier enregistrement dans les livres est atteint. À la fin de la boucle, text_output contiendra une liste de tous les titres de livres qui correspondent au numéro d’identification du sujet passé à la fonction. La variable text_output est renvoyée à la fin de la fonction.

L’exemple 11-47 montre les résultats de la fonction extract_title() lorsque 2, qui représente « Livres pour enfants » dans la table des sujets, est passé en argument.

La variable row_data est déclarée en tant que %type de ligne de la table books car elle ne sera utilisée que pour contenir les enregistrements de la table books. Nous aurions pu déclarer row_data comme aRECORD pour obtenir le même résultat, mais le type d’enregistrement doit être utilisé lorsque vous allez utiliser la variable pour plus que les lignes d’une table spécifique:

row_data RECORD;

La fonction extract_title() renvoie les mêmes résultats que les données de ligne soient déclarées comme ENREGISTREMENT ou déclarées à l’aide de %ROWTYPE.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.