La différence la plus générale entre les procédures et les fonctions est qu'ils sont appelés différemment et à des fins différentes:
- 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.
- Une fonction est invoquée dans une expression et renvoie une seule valeur directement à l'appelant à utiliser dans l'expression.
- Vous ne pouvez pas appeler une fonction avec une instruction CALL et vous ne pouvez pas non plus appeler une procédure dans une expression.
Syntaxe de création routine diffère quelque peu de procédures et de fonctions:
- 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 peuvent être consultées dans les instructions qui suivent l'instruction CALL. Les fonctions ont seulement 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.
Les fonctions renvoient la 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 appeler une procédure stockée, utilisez le CALL statement
. Pour invoquer une fonction stockée, reportez-vous à celle-ci dans une expression. La fonction renvoie une valeur pendant l'évaluation de l'expression.
Une procédure est appelée à l'aide d'une instruction CALL et ne peut que renvoyer des valeurs à l'aide de variables de sortie. Une fonction peut être appelée depuis une instruction comme n'importe quelle autre fonction (c'est-à-dire en appelant le nom de la fonction), et peut renvoyer une valeur scalaire.
La spécification d'un paramètre comme IN, OUT ou INOUT est valide uniquement 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 mémorisé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.
de définir une procédure stockée ou une fonction, utiliser 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 procédure stockée (pas de fonctions) est une procédure peut générer un résultat définir, 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 (en référence aux deux procédures stockées et fonctions stockées) sont associées à une base de données particulière, comme des tables ou vues. Lorsque vous supprimez une base de données, les routines stockées dans la base de données sont également supprimées.
Les procédures stockées et les fonctions 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.
déclarations SQL préparée (PREPARE, EXECUTE, DEALLOCATE PRÉPARER) peuvent être utilisés dans des procédures stockées, mais ne sont pas stockées fonctions ou déclencheurs. Ainsi, les fonctions stockées et les déclencheurs ne peuvent pas utiliser SQL dynamique (où vous construisez des instructions sous forme de chaînes, puis les exécutez). (Dynamic SQL in MySQL stored routines)
Quelques différences les plus intéressantes entre la fonction et la procédure: STORED
(. Ce point est copied from a blogpost) procédure stockée est plan d'exécution précompilé alors que les fonctions ne sont pas. Fonction Analysée et compilée lors de l'exécution. Procédures stockées, stockées en tant que pseudo-code dans la base de données, c'est-à-dire en forme compilée.
(Je ne suis pas sûr de ce point.)
procédure stockée a la sécurité et réduit le réseau trafic et aussi nous pouvons appeler la procédure stockée dans un non. de applications à la fois. Les fonctions sont normalement utilisées pour les calculs où procédures sont normalement utilisées pour l'exécution de la logique métier.
Les fonctions peuvent ne pas affecter l'état de base de données (déclarations qui ne commettent ou rollback explicite ou implicite ne sont pas autorisées en fonction) Alors que Les procédures stockées peuvent affecter l'état de base de données à l'aide de commettre etc.
refrence: J.1. Restrictions on Stored Routines and Triggers
Les fonctions ne peuvent pas utiliser les instructions FLUSH, contrairement aux procédures stockées.
Les fonctions stockées ne peuvent pas être récursives alors que les procédures stockées peuvent l'être. Remarque: Les procédures stockées récursives sont désactivées par défaut, mais peuvent être activées sur le serveur en définissant la variable système max_sp_recursion_depth sur une valeur différente de zéro. Voir Section 5.2.3, “System Variables”, pour plus d'informations.
Dans une fonction ou un déclencheur mémorisé, il n'est pas permis de modifier une table déjà utilisée (pour la lecture ou l'écriture) par l'instruction qui a appelé la fonction ou le déclencheur. bon exemple: How to Update same table on deletion in MYSQL?
Remarque: que, bien que certaines restrictions sont normalement appliquées aux fonctions stockées et les triggers, mais pas aux procédures stockées, ces restrictions ne sont applicables aux procédures stockées si elles sont invoquées à partir d'une fonction stockée ou 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.
Quel genre de limitations ne fonctionne ont? – Fantius
Ah, j'ai trouvé quelques bonnes informations ici: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html – Fantius