Les sous-programmes en SQL se déclinent en deux types :
CALL/EXEC et ne sont pas toujours utilisées dans la couche SELECT.Important :
Exemple de fonction scalaire (PostgreSQL) :
CREATE FUNCTION get_tax(amount NUMERIC, rate NUMERIC DEFAULT 0.13) RETURNS NUMERIC AS $$ BEGIN RETURN amount * rate; END; $$ LANGUAGE plpgsql; -- utilisation : SELECT *, get_tax(price) AS tax FROM product;
Exemple de procédure stockée (SQL Server) :
CREATE PROCEDURE add_employee(@name NVARCHAR(100), @salary INT, @emp_id INT OUTPUT) AS BEGIN INSERT INTO employees (name, salary) VALUES (@name, @salary); SET @emp_id = SCOPE_IDENTITY(); END; DECLARE @id INT; EXEC add_employee 'John', 100000, @id OUTPUT;
Peut-on utiliser une procédure stockée directement dans SELECT ?
On répond souvent "oui", mais c'est incorrect.
Réponse :
EXEC/CALL), tandis que les fonctions peuvent être utilisées dans SELECT.Histoire
Projet : Système de comptabilité primaire, mise en œuvre de rapports. Erreur : Au lieu d'une fonction, une procédure a été écrite pour calculer la somme — SELECT ne fonctionnait pas, il a fallu réécrire toute la logique des rapports utilisateurs.
Histoire
Projet : Système ERP avec des paramètres externes. Erreur : Pour la procédure, le mot-clé OUT n'a pas été défini, du coup le client ne pouvait pas connaître l'ID de l'enregistrement ajouté, l'intégration s'est "cassée".
Histoire
Projet : Service financier avec calculs de taxes selon différentes règles. Erreur : Utilisation d'une fonction scalaire dans une requête massive sans test de performance — la requête a ralenti le traitement de la table en raison de l'appel ligne par ligne (plan non optimisé).