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 ».