2009-04-21 8 views
62

Quelle est la différence entre la fonction et la procédure en PL/SQL?Quelle est la différence entre la fonction et la procédure en PL/SQL?

+13

Je ne suis pas d'accord avec cela étant un doublon. En général, les termes de langage de programmation comme la procédure et la fonction ne sont pas utilisés de la même manière dans un système de base de données. C'est une bonne question, c'est juste que la réponse est "la même différence qu'avec les langages de programmation: voir ". –

+1

Quelqu'un at-il la liste des différences depuis oracle 11g et en avant? Je pense que nous pouvons utiliser certaines fonctionnalités supplémentaires dans les fonctions maintenant! – MozenRath

Répondre

45

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 

Remarquez que la fonction a une clause de retour entre la liste des paramètres et le mot-clé « comme ». Cela signifie qu'il devrait avoir la dernière déclaration à l'intérieur du corps de la fonction de lecture quelque chose comme:

return(my_varchar2_local_variable); 

Où my_varchar2_local_variable est une varchar2 qui doit être retourné par cette fonction.

+14

Pour clarifier un peu, vous pouvez toujours obtenir des valeurs OUT à partir d'une procédure - en fait vous pouvez avoir une valeur de retour pour chaque paramètre OUT que vous spécifiez. – GoingTharn

15

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

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 qui peut être fait avec des fonctions dans ce contexte, 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 permet de l'utiliser en ligne dans la requête si elle est définie comme "pure".

Sinon, une fonction (pas nécessairement déterministe) peut renvoyer une variable ou un jeu de résultats. Dans le cas d'une fonction renvoyant un ensemble de résultats, vous pouvez la joindre à une autre sélection dans 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 d'ensemble de résultats sera retourné (c'est intraitable par calcul, comme le problème d'arrêt).

+0

Cela n'a peut-être pas de sens, mais l'optimiseur ne vous empêche pas d'utiliser des fonctions non déterministes n'importe où. –

-2
  1. nous pouvons appeler une procédure stockée à l'intérieur de la procédure stockée, fonction dans la fonction, StoredProcedure dans la fonction, mais nous ne pouvons pas appeler la fonction dans la procédure stockée.
  2. nous pouvons appeler la fonction dans l'instruction select.
  3. Nous pouvons renvoyer la valeur de la fonction sans passer le paramètre de sortie en paramètre à la procédure stockée.

C'est ce que la différence que j'ai trouvé. S'il vous plaît laissez-moi savoir s'il y en a.

+1

Vous êtes incorrect - il n'y a aucune raison pour laquelle vous ne pouvez pas appeler une fonction à partir d'une procédure. –

-1

Voici les principales différences entre la procédure et la fonction,

  1. procédure est nommé bloc PL/SQL qui exécute une ou plusieurs tâches. où la fonction est appelée bloc PL/SQL qui effectue une action spécifique.
  2. La procédure peut renvoyer ou non une valeur où la fonction doit renvoyer une valeur.
  3. nous pouvons appeler des fonctions dans l'instruction select où, comme procédure, nous ne pouvons pas.
+3

Une fonction ne peut-elle pas effectuer plus d'une "action"? Il ne renvoie que le type de données. – Ben

-1

D'une manière toute simple, cela fait sens.

Fonctions:

Ces sous-programmes renvoient une valeur unique ; principalement utilisé pour calculer et renvoyer une valeur.

Procédure:

Ces ne subprograms retourner une valeur directement; principalement utilisé pour effectuer une action.

Exemple de programme:

CREATE OR REPLACE PROCEDURE greetings 

BEGIN 

dbms_output.put_line('Hello World!'); 

END ; 
/

Exécution d'une procédure autonome:

Une procédure autonome peut être appelé de deux façons:

• Utilisation du EXECUTE mot-clé • L'appel de la nom de la procédure d'un bloc PL/SQL

La procédure peut également être appelé d'un autre bloc PL/SQL:

BEGIN 
greetings; 
END; 
/

Fonction:

CREATE OR REPLACE FUNCTION totalEmployees 
RETURN number IS 
total number(3) := 0; 
BEGIN 
SELECT count(*) into total 
FROM employees; 
RETURN total; 
END; 
/

programme suivant appelle la fonction totalCustomers d'un autre bloc

DECLARE 
c number(3); 
BEGIN 
c := totalEmployees(); 
dbms_output.put_line('Total no. of Employees: ' || c); 
END; 
/
0

Les procédures stockées et les fonctions sont appelées bloacks qui résident dans le Da tabase et peut être exécuté en tant que de besoin.

Les principales différences sont les suivantes:

1.A procédure stockée peut éventuellement des valeurs de retour à l'aide des paramètres, mais peut aussi être écrit d'une manière sans retourner une valeur fonction .Mais doit retourner une valeur

2. Une procédure stockée ne peut pas être utilisée dans une instruction select où les fonctions peuvent être utilisées dans une instruction select. En pratique, je choisirais une procédure stockée pour un groupe spécifique d'exigences et une fonction pour une exigence commune qui pourrait être partagée entre plusieurs scénarios pour g: comparer deux chaînes, ou les rogner ou prendre la dernière partie, si nous avons une fonction pour cela, nous pourrions l'utiliser globalement pour n'importe quelle application que nous avons

-1

En quelques mots - la fonction renvoie quelque chose. Vous pouvez utiliser la fonction dans une requête SQL. La procédure fait partie du code pour faire quelque chose avec des données mais vous ne pouvez pas invoquer une procédure à partir d'une requête, vous devez l'exécuter dans un bloc PL/SQL.

Questions connexes