Bases des fonctions PL/pgSQL
Écrivez des fonctions PL/pgSQL avec des paramètres, RETURNS TABLE, un flux de contrôle (IF, LOOP, FOREACH) et la gestion des exceptions.
Bases des fonctions PL/pgSQL est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.
Qu’est-ce que PL/pgSQL ?
Le langage procédural intégré de PostgreSQL. SQL enrichi de variables, du contrôle de flux, des exceptions et de la possibilité d’appeler des requêtes dynamiquement. Il est utilisé pour les procédures stockées et les fonctions de déclencheur.
Structure d’une fonction
Une fonction simple :
CREATE OR REPLACE FUNCTION add(a INT, b INT)
RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
SELECT add(2, 3); -- 5Variables
Déclarez-les avec DECLARE ; affectez-leur une valeur avec := ou INTO :
CREATE FUNCTION user_orders(uid BIGINT)
RETURNS INT AS $$
DECLARE
cnt INT;
BEGIN
SELECT COUNT(*) INTO cnt FROM orders WHERE user_id = uid;
RETURN cnt;
END;
$$ LANGUAGE plpgsql STABLE;Contrôle de flux
IF / ELSE, FOR, WHILE, CASE :
IF cnt = 0 THEN
RAISE NOTICE 'no orders';
ELSIF cnt < 10 THEN
RAISE NOTICE 'few';
ELSE
RAISE NOTICE 'many';
END IF;
FOR i IN 1..10 LOOP
RAISE NOTICE '%', i;
END LOOP;Parcourir les résultats d’une requête
Itération de type curseur :
CREATE FUNCTION recalc_totals() RETURNS VOID AS $$
DECLARE
r RECORD;
BEGIN
FOR r IN SELECT id FROM users LOOP
UPDATE users SET
order_count = (SELECT COUNT(*) FROM orders WHERE user_id = r.id)
WHERE id = r.id;
END LOOP;
END;
$$ LANGUAGE plpgsql;RETURNS TABLE
Renvoyer un ensemble de résultats :
CREATE FUNCTION top_buyers(n INT)
RETURNS TABLE (user_id BIGINT, total NUMERIC) AS $$
BEGIN
RETURN QUERY
SELECT o.user_id, SUM(o.total)
FROM orders o
GROUP BY o.user_id
ORDER BY SUM(o.total) DESC
LIMIT n;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM top_buyers(10);Paramètres IN / OUT / INOUT
Plusieurs valeurs de retour :
CREATE FUNCTION stats(uid BIGINT,
OUT total NUMERIC,
OUT cnt INT) AS $$
BEGIN
SELECT SUM(total), COUNT(*) INTO total, cnt
FROM orders WHERE user_id = uid;
END;
$$ LANGUAGE plpgsql STABLE;
SELECT * FROM stats(42); -- total | cntGestion des exceptions
BEGIN ... EXCEPTION WHEN ... THEN :
BEGIN
INSERT INTO users (email) VALUES ($1);
EXCEPTION
WHEN unique_violation THEN
RAISE NOTICE 'email already exists';
WHEN OTHERS THEN
RAISE;
END;RAISE pour la journalisation
Niveaux : DEBUG, LOG, INFO, NOTICE, WARNING, EXCEPTION :
RAISE NOTICE 'processed % rows', cnt;
RAISE EXCEPTION 'bad state: %', state USING ERRCODE = 'check_violation';Marqueurs de volatilité
Indiquez correctement les fonctions au planificateur :
- IMMUTABLE — les mêmes arguments donnent toujours le même résultat (aucune E/S) ; permet l’intégration en ligne et l’utilisation avec un index
- STABLE — les mêmes arguments donnent le même résultat au sein d’une requête
- VOLATILE — le résultat peut varier à chaque appel (valeur par défaut ; correcte pour NOW(), RANDOM())
SECURITY DEFINER
S’exécute avec les privilèges du propriétaire de la fonction — à utiliser avec précaution :
CREATE FUNCTION sensitive_op() RETURNS VOID
LANGUAGE plpgsql
SECURITY DEFINER
AS $$ ... $$;
-- Always set search_path explicitly to avoid hijacking:
ALTER FUNCTION sensitive_op() SET search_path = public, pg_temp;Récapitulatif
PL/pgSQL étend SQL avec des boucles, IF, des exceptions et des retours structurés. Utilisez-le pour une logique cohérente en plusieurs étapes qui gagne à s’exécuter près des données.
Vérification rapide
Quel marqueur de volatilité devez-vous utiliser pour une fonction qui renvoie le même résultat avec les mêmes arguments, sans effets secondaires ni E/S ?
Questions Fréquemment Posées
La leçon « Bases des fonctions PL/pgSQL » est-elle gratuite ?
Oui — le texte complet de « Bases des fonctions PL/pgSQL » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Bases des fonctions PL/pgSQL » ?
Écrivez des fonctions PL/pgSQL avec des paramètres, RETURNS TABLE, un flux de contrôle (IF, LOOP, FOREACH) et la gestion des exceptions. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Academy ?
Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Bases des fonctions PL/pgSQL » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?
Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Anatomie des déclencheurs : BEFORE/AFTER, FOR EACH ROW
- Bases des fonctions PL/pgSQL
- Blocs DO et code anonyme
- Auditer des tables avec des déclencheurs