web-dev-qa-db-fra.com

Quelles sont les différences entre les "procédures stockées" et les "fonctions stockées"?

Donc, un commentaire de cette question mentionne qu'il y a une légère différence entre "Stored Procedrues" et "Stored Funtions" dans PostgreSQL.

Le commentaire renvoie à un article wikipedia mais certains ne semblent pas s'appliquer (par exemple, ils peuvent être utilisés dans une instruction SELECT).

La syntaxe elle-même semble un peu déroutante:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Vous créez un FUNCTION mais vous vous y référez en tant que PROCEDURE.

Alors, quelle est la différence entre ces deux?

37
DrColossos

Officiellement, PostgreSQL n'a que des "fonctions". Les fonctions de déclenchement sont parfois appelées "procédures de déclenchement", mais cette utilisation n'a pas de signification distincte. En interne, les fonctions sont parfois appelées procédures, comme dans le catalogue système pg_proc. C'est un reliquat de PostQUEL. Toutes les fonctionnalités que certaines personnes (possiblement expérimentées dans différents systèmes de bases de données) pourraient associer à des procédures, telles que leur pertinence pour empêcher les injections SQL ou l'utilisation de paramètres de sortie, s'appliquent également aux fonctions telles qu'elles existent dans PostgreSQL.

Désormais, lorsque les membres de la communauté PostgreSQL parlent de "procédures stockées" ou de "procédures stockées réelles", ils signifient souvent une caractéristique hypothétique d'un objet de type fonction qui peut démarrer et arrêter des transactions dans son corps, ce que les fonctions actuelles ne peuvent pas faire. L'utilisation du terme "procédure stockée" dans ce contexte semble se faire par analogie avec d'autres produits de base de données. Voir cette liste de diffusion fil pour une vague idée.

Dans la pratique, cependant, cette distinction de la fonction par rapport à la procédure en termes de capacités de contrôle des transactions n'est pas universellement acceptée, et de nombreux programmeurs sans biais de base de données adopteront certainement une interprétation de type Pascal d'une procédure en tant que fonction sans valeur de retour. (Le standard SQL semble prendre un compromis, en ce sens qu'une procédure par par défaut a un comportement de transaction différent d'une fonction, mais cela peut être ajusté par objet.) Dans tous les cas, et surtout lorsque vous examinez des questions sur Stack Exchange avec un public très mixte, vous devez éviter d'en supposer trop et utiliser des termes plus clairs ou définir les propriétés que vous attendez.

44
Peter Eisentraut

En termes de DDL, Postgres n'a pas d'objets de procédure, seulement des fonctions. Les fonctions Postgres peuvent retourner des valeurs ou être nulles et assumer ainsi les rôles de fonctions et de procédures dans d'autres SGBDR. La "procédure" de Word dans le create trigger fait référence à une fonction.

En termes de documentation Postgres, 'procédure' est également synonyme de l'objet de base de données appelé fonction, par exemple: " ne procédure de déclenchement est créée avec la commande CREATE FUNCTION ".

Les "procédures" de déclenchement ont des règles particulières: elles doivent être déclarées comme une fonction sans arguments et un type de déclenchement de retour . Exemple ici .

Les termes "procédure stockée" et "fonction stockée" sont utilisés de manière interchangeable dans PostgreSQL et sont généralement considérés comme signifiant la même chose. D'autres bases de données peuvent faire la différence entre une procédure et une fonction (un peu comme la façon dont VB différencie les sous-routines et les fonctions).

Tant qu'une fonction dans PostgreSQL renvoie quelque chose qui ressemble à une table, vous pouvez utiliser la sortie de cette fonction comme s'il s'agissait d'une table standard. Le CREATE TRIGGER la syntaxe est un peu déroutante, mais je pense qu'elle était peut-être en place avant la finalisation de la norme ANSI. Je n'ai qu'une copie de SQL: 2003, donc je ne peux pas faire beaucoup plus que spéculer sur la raison pour laquelle la nomenclature est bizarre.

TL; version DR: avec PostgreSQL "procédure" est équivalente à "fonction".

8
Jeremiah Peschka

Dans MSSQL, une procédure stockée est un ensemble précompilé de commandes sql.
Une procédure stockée:

 - peut avoir de nombreux paramètres d'entrée et de sortie 
 - peut être utilisé pour modifier les tables/structures/données de la base de données 
 - n'est normalement pas utilisé dans les instructions insert/update/delete/select 
. 
 - retourne un tableau (c'est-à-dire sélectionnez * dans dbo.ExplodeString ("ceci est une liste de mots")) 
 - peut être utilisé dans les instructions select/insert/update/delete 
 - NE PEUT PAS être utilisé pour modifier des tables/structures/données de base de données 
6
datagod

La réponse courte est qu'une fonction renvoie une valeur, mais pas une procédure.

Cette distinction était présente dans les modules stockés persistants (SQL/PSM), qui a été proposé pour SQL 1992. Je ne sais pas si SQL/PSM a déjà été intégré dans les normes.

En comparant la réponse acceptée du niveau conceptuel abstrait, je comprends la différence entre la fonctionnalité et la perspective d'entrée/sortie. Ci-dessous, j'ai utilisé sp et f pour représenter respectivement la procédure et la fonction stockées.

  1. Utiliser dans une expression: sp ne peut pas être utilisé dans une expression alors que la fonction peut, ce qui signifie que vous pouvez utiliser la valeur renvoyée par un f à l'intérieur d'autres instructions, comme

    select * 
    from table 
    where col_a < (select col_A from f())
    
  2. retourne une valeur: sp ne retourne pas automatiquement une valeur sauf si vous spécifiez refcursor return type, open et return a cursor; f renvoie le résultat dans la dernière instruction où une clause 'return' est incorporée, comme une clause select .

  3. return single/multiple result sets: ici, les jeux de résultats font référence à une liste de résultats dont le format peut différer, comme un ensemble d'un seul entier, un tableau de texte et deux tableaux. sp peut renvoyer plusieurs ensembles tant que vous spécifiez le type de retour refcursor, ouvrez et renvoyez un curseur. Cependant, f ne peut renvoyer qu'un seul type d'ensemble.

Habituellement, les procédures stockées sont utilisées pour modifier les données ou la structure de la base de données où la valeur de retour n'est pas nécessaire, comme supprimer, mettre à jour, supprimer , etc; ou des situations où plusieurs jeux de résultats sont requis. La fonction, d'autre part, est principalement choisie pour les requêtes simples.

Pour plus de détails concernant mon explication, veuillez vous référer à ce lien: Procédures et fonctions stockées dans PostgreSQL

2
Frank

Notez que dans PostgreSQL 11, les procédures stockées ont été ajoutées en tant que nouvel objet de schéma. Vous pouvez créer une nouvelle procédure en utilisant CREATE PROCEDURE instruction.

Les procédures stockées diffèrent des fonctions des manières suivantes:

  • Les procédures stockées n'ont pas de valeur de retour
  • Vous pouvez valider et annuler des transactions dans des procédures stockées, mais pas dans des fonctions
  • Vous exécutez une procédure stockée à l'aide de l'instruction CALL plutôt que d'une instruction SELECT.
1
d4nyll