Was ist der Unterschied zwischen Funktion und Prozedur in PL / SQL?


72

Was ist der Unterschied zwischen Funktion und Prozedur in PL / SQL?


14
Ich würde nicht zustimmen, dass dies ein Duplikat ist. Im Allgemeinen werden Programmiersprachenbegriffe wie Prozedur und Funktion in einem Datenbanksystem nicht auf die gleiche Weise verwendet. Dies ist eine gute Frage, nur dass die Antwort "der gleiche Unterschied wie bei Programmiersprachen: siehe <andere Frage>" ist.
John Saunders

1
Hat jemand die Liste der Unterschiede seit Orakel 11g und weiter? Ich denke, wir können jetzt bestimmte zusätzliche Funktionen in Funktionen verwenden!
MozenRath

Antworten:


50

Eine Prozedur hat keinen Rückgabewert, während eine Funktion hat.

Beispiel:

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

Beachten Sie, dass die Funktion eine Rückgabeklausel zwischen der Parameterliste und dem Schlüsselwort "as" hat. Dies bedeutet, dass erwartet wird, dass die letzte Anweisung im Hauptteil der Funktion ungefähr so ​​lautet:

return(my_varchar2_local_variable);

Wobei my_varchar2_local_variable ein varchar2 ist, das von dieser Funktion zurückgegeben werden sollte.


15
Zur Verdeutlichung können Sie immer noch OUT-Werte aus einer Prozedur abrufen. Tatsächlich können Sie für jeden von Ihnen angegebenen OUT-Parameter einen Rückgabewert festlegen.
GoingTharn

17

Eine Funktion kann in eine SQL-Anweisung integriert werden, z

select foo
      ,fn_bar (foo)
  from foobar

Was mit einer gespeicherten Prozedur nicht möglich ist. Die Architektur des Abfrageoptimierers schränkt ein, was mit Funktionen in diesem Kontext getan werden kann, und erfordert, dass sie rein sind (dh dieselben Eingaben erzeugen immer dieselbe Ausgabe). Dies schränkt die Möglichkeiten der Funktion ein, ermöglicht jedoch die Verwendung in der Abfrage, wenn sie als "rein" definiert ist.

Andernfalls kann eine Funktion (nicht unbedingt deterministisch) eine Variable oder eine Ergebnismenge zurückgeben. Wenn eine Funktion eine Ergebnismenge zurückgibt, können Sie sie mit einer anderen Auswahl in einer Abfrage verknüpfen. Sie können eine nicht deterministische Funktion wie diese jedoch nicht in einer korrelierten Unterabfrage verwenden, da der Optimierer nicht vorhersagen kann, welche Art von Ergebnismenge zurückgegeben wird (dies ist wie das Stoppproblem rechenintensiv).


Es mag nicht sinnvoll sein, aber der Optimierer hindert Sie nicht daran, nicht deterministische Funktionen irgendwo zu verwenden.
Jon Heller

1

Sowohl gespeicherte Prozeduren als auch Funktionen sind benannte Blöcke, die sich in der Datenbank befinden und bei Bedarf ausgeführt werden können.

Die Hauptunterschiede sind:

  1. Eine gespeicherte Prozedur kann optional Werte mit out-Parametern zurückgeben, kann aber auch so geschrieben werden, dass kein Wert zurückgegeben wird. Eine Funktion muss jedoch einen Wert zurückgeben.

  2. Eine gespeicherte Prozedur kann nicht in einer SELECT-Anweisung verwendet werden, während eine Funktion in einer SELECT-Anweisung verwendet werden kann.

In der Praxis würde ich mich für eine gespeicherte Prozedur für eine bestimmte Gruppe von Anforderungen und eine Funktion für eine gemeinsame Anforderung entscheiden, die in mehreren Szenarien gemeinsam genutzt werden kann. Beispiel: Vergleichen Sie zwei Zeichenfolgen, schneiden Sie sie ab oder nehmen Sie den letzten Teil. Wenn wir eine Funktion dafür haben, können Sie sie global für jede Anwendung verwenden, die wir haben.


0

Auf absolut einfache Weise macht es diese Bedeutung.

Funktionen:

Diese Unterprogramme geben einen einzelnen Wert zurück . Wird hauptsächlich zum Berechnen und Zurückgeben eines Werts verwendet.

Vorgehensweise:

Diese Unterprogramme geben keinen Wert direkt zurück. wird hauptsächlich verwendet, um eine Aktion auszuführen.

Beispielprogramm:

CREATE OR REPLACE PROCEDURE greetings

BEGIN 

dbms_output.put_line('Hello World!');

END ;
/

Ausführen einer eigenständigen Prozedur:

Eine eigenständige Prozedur kann auf zwei Arten aufgerufen werden:

• Verwenden des EXECUTESchlüsselworts • Aufrufen des Namens der Prozedur aus einem PL / SQL-Block

Die Prozedur kann auch von einem anderen PL / SQL-Block aufgerufen werden:

BEGIN 
greetings;
END;
/

Funktion:

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

Das folgende Programm ruft die Funktion totalCustomersvon einem anderen Block auf

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

-1

Das Folgende sind die Hauptunterschiede zwischen Verfahren und Funktion:

  1. Die Prozedur heißt PL / SQL-Block und führt eine oder mehrere Aufgaben aus. Dabei heißt die Funktion PL / SQL-Block, der eine bestimmte Aktion ausführt.
  2. Die Prozedur kann einen Wert zurückgeben oder nicht, wobei als Funktion ein Wert zurückgegeben werden soll.
  3. Wir können Funktionen in der select-Anweisung aufrufen, wo wir als Prozedur nicht können.

3
Kann eine Funktion nicht mehr als eine "Aktion" ausführen? Es gibt nur Datentyp.
Ben

-1

In den wenigen Worten - Funktion gibt etwas zurück. Sie können die Funktion in der SQL-Abfrage verwenden. Die Prozedur ist Teil des Codes, um etwas mit Daten zu tun, aber Sie können die Prozedur nicht über die Abfrage aufrufen, sondern müssen sie im PL / SQL-Block ausführen.


-2
  1. Wir können eine gespeicherte Prozedur innerhalb einer gespeicherten Prozedur, eine Funktion innerhalb einer Funktion und eine gespeicherte Prozedur innerhalb einer Funktion aufrufen, aber wir können keine Funktion innerhalb einer gespeicherten Prozedur aufrufen.
  2. Wir können die Funktion innerhalb der select-Anweisung aufrufen.
  3. Wir können einen Wert von der Funktion zurückgeben, ohne den Ausgabeparameter als Parameter an die gespeicherte Prozedur zu übergeben.

Das ist der Unterschied, den ich gefunden habe. Bitte lassen Sie mich wissen, wenn überhaupt.


1
Sie sind falsch - es gibt keinen Grund, warum Sie eine Funktion nicht über eine Prozedur aufrufen können.
Bob Jarvis - Stellen Sie Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.