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;

Chaque déclaration et chaque expression au sein du bloc est terminé par un 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 somefunc() RETURNS integer AS '
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE ''Quantity here is %'', quantity;  -- Quantity here is 30
    quantity := 50;
    --
    -- Crée un sous-bloc
    --
    DECLARE
        quantity integer := 80;
    BEGIN
        RAISE NOTICE ''Quantity here is %'', quantity;  -- Quantity here is 80
    END;

    RAISE NOTICE ''Quantity here is %'', quantity;  -- Quantity here is 50

    RETURN quantity;
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 effectuer un commit sur une transaction puisque PostgreSQL ne gère pas les transactions imbriquées.