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


36

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

Le commentaire est lié à un article de Wikipédia, mais certains ne semblent pas s’appliquer (par exemple, ils peuvent être utilisés dans une SELECTdéclaration).

La syntaxe elle-même semble être 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 FUNCTIONmais vous vous y référez en tant que PROCEDURE.

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

Réponses:


43

Officiellement, PostgreSQL n'a que des "fonctions". Les fonctions de déclenchement sont parfois appelées "procédures de déclenchement", mais cet usage n'a pas de sens distinct. En interne, les fonctions sont parfois appelées procédures, comme dans le catalogue système pg_proc. C'est une retenue de PostQUEL. Toutes les fonctionnalités que certaines personnes (ayant éventuellement une expérience dans différents systèmes de base 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 désignent souvent une caractéristique hypothétique d'un objet de type fonction pouvant démarrer et arrêter des transactions dans son corps, ce que les fonctions actuelles ne peuvent pas. faire. L'utilisation de l'expression "procédure stockée" dans ce contexte semble se faire par analogie avec d'autres produits de base de données. Voir ce fil de liste de diffusion pour une idée vague.

Dans la pratique, toutefois, cette distinction entre fonction et 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 prendront une interprétation de type Pascal d'une procédure comme une fonction sans valeur de retour. (Le standard SQL semble prendre un terrain d'entente, en ce sens qu'une procédure a par défaut un comportement de transaction différent de celui d'une fonction, mais cela peut être ajusté par objet.) Donc, dans tous les cas, et surtout quand on regarde des questions sur Stack Exchange avec Pour un public très hétérogène, évitez de trop en prendre et utilisez des termes plus clairs ou définissez les propriétés que vous attendez.


14

En termes de DDL, Postgres n'a pas d'objets de procédure, mais uniquement des fonctions. Les fonctions Postgres peuvent renvoyer des valeurs ou être nulles afin de jouer le rôle des fonctions et des procédures dans d'autres SGBDR. Le mot procédure se create triggerréfère à une fonction.

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

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


8

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 différencier une procédure et une fonction (un peu comme le fait VB pour différencier les sous-programmes 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. La CREATE TRIGGERsyntaxe est un peu déroutante, mais je suppose qu'elle a peut-être été en place avant la finalisation de la norme ANSI. Je n'ai qu'une copie de SQL: 2003, je ne peux donc pas faire plus que de spéculer sur la raison pour laquelle la nomenclature est étrange.

TL; version DR: avec PostgreSQL, "procédure" équivaut à "fonction".


6

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
 - ne sont normalement pas utilisés dans les instructions insert / update / delete / select
Les fonctions définies par l'utilisateur sont de plusieurs types. Selon le type de fonction écrit, les fonctions:
  - peut avoir plusieurs paramètres d'entrée, mais ne renvoyer qu'une seule valeur (c'est-à-dire une concaténation de chaîne)
  - peut accepter un ensemble en tant qu'entrée, renvoyer une valeur unique (par exemple, dbo.FindLargestPig (ListOfPigs))
  - retourne une table (c'est-à-dire sélectionnez * depuis 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


5

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), proposés pour SQL 1992. Je ne sais pas si SQL / PSM a déjà été intégré aux normes.


d'ici à 2003, je crois
xenoterracide

Cela ressemble remarquablement à la syntaxe de VB. Une fonction retourne une valeur et une procédure ne le fait pas (donc si vous aviez une valeur de retour dans une fonction, elle exploserait sur le compilateur)
jcolebrand

@jcolebrand En fait, les noms sont plus évidents en Pascal. Une procédure ne renvoie pas de résultat, contrairement à une fonction . Pour des raisons historiques, VBA utilise le langage FORTRAN, qui les appelle (appelés?) SUBROUTINE & FUNCTION . Les langages modernes de type C n'ont que des fonctions, mais les langages typés ont l'option de fonctions vides qui sont des procédures sous un autre nom. Une tendance populaire consiste simplement à utiliser les fonctions normales pour tout et à renvoyer quelque chose qui peut être ignoré si vous le souhaitez.
Manngo

2

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

  1. Utilisation dans une expression: sp ne peut pas être utilisé dans une expression avec une fonction, ce qui signifie que vous pouvez utiliser votre valeur renvoyée de af dans d'autres instructions, telles que

    select * 
    from table 
    where col_a < (select col_A from f())
  2. return a value: sp ne renvoie automatiquement une valeur que si vous spécifiez le type de retour refcursor , open et le curseur de retour. f renvoie le résultat dans la dernière instruction dans laquelle une clause 'return' est incorporée, comme une clause select .

  3. return single / multiple result sets: ici, les ensembles de résultats renvoient à une liste de résultats dont le format peut varier, comme un ensemble d'entiers uniques, 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 lorsqu'une valeur renvoyée n'est pas nécessaire, comme supprimer, mettre à jour, supprimer , etc. ou des situations où plusieurs ensembles de résultats sont requis. La fonction, en revanche, 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 stockées et fonctions dans PostgreSQL

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.