Mysql
 sql >> Base de données >  >> RDS >> Mysql

Procédure stockée MySQL vs fonction, laquelle utiliserais-je quand ?

La différence la plus générale entre les procédures et les fonctions est qu'elles sont invoquées différemment et à des fins différentes :

  1. Une procédure ne renvoie pas de valeur. Au lieu de cela, il est appelé avec une instruction CALL pour effectuer une opération telle que la modification d'une table ou le traitement des enregistrements récupérés.
  2. Une fonction est invoquée dans une expression et renvoie une seule valeur directement à l'appelant à utiliser dans l'expression.
  3. Vous ne pouvez pas invoquer une fonction avec une instruction CALL, ni invoquer une procédure dans une expression.

La syntaxe de création de routine diffère quelque peu pour les procédures et les fonctions :

  1. Les paramètres de procédure peuvent être définis comme entrée uniquement, sortie uniquement ou les deux. Cela signifie qu'une procédure peut renvoyer des valeurs à l'appelant en utilisant des paramètres de sortie. Ces valeurs sont accessibles dans les instructions qui suivent l'instruction CALL. Les fonctions n'ont que des paramètres d'entrée. Par conséquent, bien que les procédures et les fonctions puissent avoir des paramètres, la déclaration des paramètres de procédure diffère de celle des fonctions.
  2. Les fonctions renvoient une valeur, il doit donc y avoir une clause RETURNS dans une définition de fonction pour indiquer le type de données de la valeur de retour. En outre, il doit y avoir au moins une instruction RETURN dans le corps de la fonction pour renvoyer une valeur à l'appelant. RETURNS et RETURN n'apparaissent pas dans les définitions de procédure.

    • Pour invoquer une procédure stockée, utilisez l'CALL statement . Pour appeler une fonction stockée, faites-y référence dans une expression. La fonction renvoie une valeur lors de l'évaluation de l'expression.

    • Une procédure est appelée à l'aide d'une instruction CALL et ne peut renvoyer des valeurs qu'à l'aide de variables de sortie. Une fonction peut être appelée depuis l'intérieur d'une instruction comme n'importe quelle autre fonction (c'est-à-dire en invoquant le nom de la fonction) et peut renvoyer une valeur scalaire.

    • La spécification d'un paramètre comme IN, OUT ou INOUT n'est valide que pour une PROCEDURE. Pour une FONCTION, les paramètres sont toujours considérés comme des paramètres IN.

    Si aucun mot-clé n'est donné avant un nom de paramètre, il s'agit d'un paramètre IN par défaut.Les paramètres des fonctions stockées ne sont pas précédés de IN, OUT ou INOUT. Tous les paramètres de fonction sont traités comme des paramètres IN.

Pour définir une procédure stockée ou une fonction, utilisez respectivement CREATE PROCEDURE ou CREATE FUNCTION :

CREATE PROCEDURE proc_name ([parameters])
 [characteristics]
 routine_body


CREATE FUNCTION func_name ([parameters])
 RETURNS data_type       // diffrent
 [characteristics]
 routine_body

Une extension MySQL pour les procédures stockées (et non les fonctions) est qu'une procédure peut générer un ensemble de résultats, ou même plusieurs ensembles de résultats, que l'appelant traite de la même manière que le résultat d'une instruction SELECT. Cependant, le contenu de ces ensembles de résultats ne peut pas être utilisé directement dans l'expression.

Routines stockées (faisant référence à la fois aux procédures stockées et aux fonctions stockées) sont associées à une base de données particulière, tout comme les tables ou les vues. Lorsque vous supprimez une base de données, toutes les routines stockées dans la base de données sont également supprimées.

Les procédures et fonctions stockées ne partagent pas le même espace de noms. Il est possible d'avoir une procédure et une fonction avec le même nom dans une base de données.

Dans les procédures stockées, le SQL dynamique peut être utilisé, mais pas dans les fonctions ou les déclencheurs.

Les instructions SQL préparées (PREPARE, EXECUTE, DEALLOCATE PREPARE) peuvent être utilisées dans les procédures stockées, mais pas dans les fonctions stockées ou les déclencheurs. Ainsi, les fonctions stockées et les déclencheurs ne peuvent pas utiliser Dynamic SQL (où vous construisez des instructions sous forme de chaînes, puis les exécutez). (SQL dynamique dans les routines stockées MySQL )

Différences plus intéressantes entre FUNCTION et STORED PROCEDURE :

  1. (Ce point est copié d'un article de blog . ) La procédure stockée est un plan d'exécution précompilé là où les fonctions ne le sont pas. Fonction Parsée et compilée au moment de l'exécution. Procédures stockées, stockées sous forme de pseudo-code dans la base de données, c'est-à-dire sous forme compilée.

  2. (Je ne suis pas sûr de ce point. )
    La procédure stockée a la sécurité et réduit le trafic réseau et nous pouvons également appeler la procédure stockée dans n'importe quel numéro. d'applications à la fois. référence

  3. Les fonctions sont normalement utilisées pour les calculs où les procédures sont normalement utilisées pour exécuter la logique métier.

  4. Les fonctions ne peuvent pas affecter l'état de la base de données (les instructions qui effectuent une validation ou une annulation explicite ou implicite sont interdites dans la fonction) Alors que les procédures stockées peuvent affecter l'état de la base de données à l'aide de la validation, etc.
    référence :J.1. Restrictions sur les routines et les déclencheurs stockés

  5. Les fonctions ne peuvent pas utiliser FLUSH alors que les procédures stockées peuvent le faire.

  6. Les fonctions stockées ne peuvent pas être récursives alors que les procédures stockées peuvent l'être. Voir Section 5.2.3 , "Variables système" , pour plus d'informations.

  7. Dans une fonction ou un déclencheur stocké, il n'est pas permis de modifier une table déjà utilisée (en lecture ou en écriture) par l'instruction qui a appelé la fonction ou le déclencheur. Bon exemple :Comment mettre à jour la même table lors de la suppression dans MYSQL ?

Remarque :que bien que certaines restrictions s'appliquent normalement aux fonctions stockées et aux déclencheurs mais pas aux procédures stockées, ces restrictions s'appliquent aux procédures stockées si elles sont appelées depuis une fonction stockée ou un déclencheur. Par exemple, bien que vous puissiez utiliser FLUSH dans une procédure stockée, une telle procédure stockée ne peut pas être appelée à partir d'une fonction stockée ou d'un déclencheur.