Was ist der Unterschied zwischen Funktion und Prozedur in PL / SQL?
Was ist der Unterschied zwischen Funktion und Prozedur in PL / SQL?
Antworten:
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.
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).
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:
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.
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.
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 EXECUTE
Schlü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 totalCustomers
von einem anderen Block auf
DECLARE
c number(3);
BEGIN
c := totalEmployees();
dbms_output.put_line('Total no. of Employees: ' || c);
END;
/
Das Folgende sind die Hauptunterschiede zwischen Verfahren und Funktion:
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.
Das ist der Unterschied, den ich gefunden habe. Bitte lassen Sie mich wissen, wenn überhaupt.