web-dev-qa-db-fra.com

MySQL procédure stockée vs fonction, lequel utiliserais-je quand?

Je regarde les procédures stockées et la fonction MySQL. Quelle est la vraie différence? 

Ils semblent être similaires, mais une fonction a plus de limites.

J'ai probablement tort, mais il semble qu'une procédure stockée peut tout faire et davantage qu'une fonction stockée peut. Pourquoi/quand utiliserais-je une procédure par rapport à une fonction?

143
Anonym

Vous ne pouvez pas mélanger des procédures stockées avec du SQL ordinaire, vous pouvez également utiliser des fonctions stockées.

par exemple. SELECT get_foo(myColumn) FROM mytable n'est pas valide si get_foo() est une procédure, mais vous pouvez le faire si get_foo() est une fonction. Le prix est que les fonctions ont plus de limitations qu'une procédure.

91
nos

La différence la plus générale entre les procédures et les fonctions est qu'elles sont appelé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 extraits.
  2. Une fonction est appelée dans une expression et renvoie une valeur unique 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 d'une 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 seulement, sortie seulement ou les deux. Cela signifie qu'une procédure peut renvoyer des valeurs à l'appelant à l'aide de paramètres de sortie. Ces valeurs sont accessibles dans les instructions qui suivent l’instruction CALL. Les fonctions ont uniquement des paramètres d'entrée. En conséquence, 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. Une définition de fonction doit donc comporter une clause RETURNS pour indiquer le type de données de la valeur renvoyée. 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 appeler une fonction stockée, reportez-vous à celle-ci 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 transmettre des valeurs qu'à 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 n'est valide que pour une PROCEDURE. Pour une FUNCTION, les paramètres sont toujours considérés comme des paramètres IN.

    Si aucun mot-clé n'est indiqué 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 par IN, OUT ou INOUT. Tous les paramètres de fonction sont traités comme des paramètres IN.

Pour définir une procédure ou une fonction stockée, 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 une procédure stockée (et non des fonctions) est qu’une procédure peut générer un jeu de résultats, voire plusieurs jeux de résultats, que l’appelant traite de la même manière que le résultat d’une instruction SELECT. Toutefois, le contenu de tels ensembles de résultats ne peut pas être utilisé directement dans une expression.

Les 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 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 nom. Il est possible de disposer d'une procédure et d'une fonction du 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 ni les déclencheurs.

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

Quelques 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é dans lequel les fonctions ne sont pas. Fonction analysée et compilée à 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 une procédure stockée dans n'importe quel no. 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 applicative.

  4. Les fonctions ne peuvent pas affecter l'état de la base de données (les instructions qui effectuent une validation explicite ou implicite ou une annulation ne sont pas autorisées dans la fonction) alors que les procédures stockées peuvent affecter l'état de la base de données en utilisant commit, etc.
    reference: J.1. Restrictions sur les routines et les déclencheurs stockés

  5. Les fonctions ne peuvent pas utiliser les instructions 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. 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, "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 (pour la lecture ou l'é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 : bien que certaines restrictions s'appliquent normalement aux fonctions et déclencheurs stockés, mais pas aux procédures stockées, ces restrictions s'appliquent aux procédures stockées si elles sont appelées de l'intérieur. une fonction ou un déclencheur stocké. 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 ou d'un déclencheur stocké.

245
Grijesh Chauhan

Une différence significative est que vous pouvez inclure une fonction dans vos requêtes SQL, mais des procédures stockées ne peuvent être appelées qu'avec l'instruction CALL :

Exemple UDF:

CREATE FUNCTION hello (s CHAR(20))
   RETURNS CHAR(50) DETERMINISTIC
   RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');

SELECT hello(name) FROM names;
+--------------+
| hello(name)  |
+--------------+
| Hello, Bob!  |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)

Sproc Exemple:

delimiter //

CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
   SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)

delimiter ;

CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World!             |
+---------------------------+
1 row in set (0.00 sec)
49
Daniel Vassallo

Une fonction stockée peut être utilisée dans une requête. Vous pouvez ensuite l'appliquer à chaque ligne ou dans une clause WHERE.

Une procédure est exécutée à l'aide de la requête CALL.

8
Evert

La procédure stockée peut être appelée de manière récursive, mais la fonction stockée ne peut pas

0
palash140