web-dev-qa-db-fra.com

Quelle est la différence entre function et procedure en PL / SQL?

Quelle est la différence entre function et procedure en PL/SQL?

68
Tony

Une procédure n'a pas de valeur de retour, alors qu'une fonction a.

Exemple:

CREATE OR REPLACE PROCEDURE my_proc
   (p_name IN VARCHAR2 := 'John') as begin ... end

CREATE OR REPLACE FUNCTION my_func
   (p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end

Notez que la fonction a une clause return entre la liste de paramètres et le mot clé "as". Cela signifie qu'il est attendu que la dernière instruction à l'intérieur du corps de la fonction lise quelque chose comme:

return(my_varchar2_local_variable);

Où my_varchar2_local_variable est un varchar2 qui devrait être renvoyé par cette fonction.

49
Petros

Une fonction peut être insérée dans une instruction SQL, par exemple.

select foo
      ,fn_bar (foo)
  from foobar

Ce qui ne peut pas être fait avec une procédure stockée. L’architecture de l’optimiseur de requêtes limite ce que l’on peut faire avec les fonctions de ce contexte, en exigeant qu’elles soient pures (c’est-à-dire que les mêmes entrées produisent toujours la même sortie). Cela restreint ce qui peut être fait dans la fonction, mais lui permet d'être utilisée en ligne dans la requête si elle est définie comme étant "pure".

Sinon, une fonction (pas nécessairement déterministe) peut renvoyer une variable ou un ensemble de résultats. Dans le cas d'une fonction renvoyant un jeu de résultats, vous pouvez le joindre à une autre sélection d'une requête. Cependant, vous ne pouvez pas utiliser une fonction non déterministe comme celle-ci dans une sous-requête corrélée, car l'optimiseur ne peut pas prédire quel type de jeu de résultats sera renvoyé (ceci est intraitable sur le plan des calculs, comme le problème bloquant).

Les procédures et les fonctions stockées sont des blocs nommés qui résident dans la base de données et peuvent être exécutés selon les besoins.

Les principales différences sont les suivantes:

  1. Une procédure stockée peut éventuellement renvoyer des valeurs à l'aide de paramètres out, mais peut également être écrite de manière à ne pas renvoyer de valeur. Mais une fonction doit retourner une valeur.

  2. Une procédure stockée ne peut pas être utilisée dans une instruction SELECT alors qu'une fonction peut être utilisée dans une instruction SELECT.

En pratique, je choisirais une procédure stockée pour un groupe d'exigences spécifique et une fonction pour une exigence commune pouvant être partagée entre plusieurs scénarios. Par exemple: comparer deux chaînes, les couper ou prendre la dernière partie, si nous avons une fonction pour cela, nous pourrions l’utiliser globalement pour toute application que nous avons.

1
Aparna