37.3. Structure de PL/pgSQL
PL/pgSQL est un langage structuré en
blocs. Le texte complet de la définition d'une fonction doit être un
bloc. Un bloc est défini comme :
[ <<label>> ]
[ DECLARE
déclarations ]
BEGIN
instructions
END [ label ];
Chaque déclaration et chaque expression au sein du bloc est terminé
par un point-virgule. Un bloc qui apparaît à l'intérieur d'un autre
bloc doit avoir un point-virgule après END,
comme montré ci-dessus ; néanmoins, le END
final qui conclut le corps d'une fonction n'a pas besoin de
point-virgule.
Tous les mots clés et identifiants peuvent être écrits en majuscules
et minuscules mélangées. Les identifiants sont implicitement
convertis en minuscule à moins d'être entourés de guillemets doubles.
Il y a deux types de commentaires dans PL/pgSQL. Un double tiret (--) débute une ligne de commentaire qui s'étend
jusqu'à la fin de la ligne. Un /* débute un
bloc de commentaire qui s'étend jusqu'à la prochaine occurrence de
*/. Les blocs de commentaires ne peuvent pas
être imbriqués, mais les commentaires de lignes (double tiret)
peuvent être contenus dans un bloc de commentaire et un double tiret
peut cacher les délimiteurs du bloc de commentaire /* et */.
Chaque expression de la section expression d'un bloc peut être un
sous-bloc. Les sous-blocs peuvent être
utilisés pour des groupements logiques ou pour localiser des
variables locales à un petit groupe d'instructions.
Les variables déclarées dans la section déclaration précédant un bloc
sont initialisées à leur valeur par défaut chaque fois qu'on entre
dans un bloc et pas seulement une fois à chaque appel de fonction.
Par exemple :
CREATE FUNCTION une_fonction() RETURNS integer AS $$
DECLARE
quantité integer := 30;
BEGIN
RAISE NOTICE 'quantité vaut ici %', quantité; -- quantité vaut ici 30
quantité := 50;
--
-- Crée un sous-bloc
--
DECLARE
quantité integer := 80;
BEGIN
RAISE NOTICE 'quantité vaut ici %', quantité; -- quantité vaut ici 80
END;
RAISE NOTICE 'quantité vaut ici %', quantité; -- quantité vaut ici 50
RETURN quantité;
END;
$$ LANGUAGE plpgsql;
Il est important de ne pas confondre l'utilisation de
BEGIN
/
END
pour grouper les instructions
dans PL/pgSQL avec les commandes de
bases de données pour le contrôle des transactions. Les
BEGIN
/
END
de PL/pgSQL ne servent qu'au groupement ; ils ne
débutent ni ne terminent une transaction. Les procédures fonctions et
déclencheurs sont toujours exécutées à l'intérieur d'une transaction
établie par une requête extérieure -- ils ne peuvent pas être
utilisés pour commencer ou valider une transaction car ils n'auraient
pas de contexte pour s'exécuter. Néanmoins, un bloc contenant une
clause EXCEPTION forme réellement une
sous-transaction qui peut être annulée sans affecter la transaction
externe. Pour plus d'informations sur ce point, voir la Section 37.7.5,
« Récupérer les erreurs ».