Der allgemeinste Unterschied zwischen Prozeduren und Funktionen besteht darin, dass sie unterschiedlich und für unterschiedliche Zwecke aufgerufen werden:
- Eine Prozedur gibt keinen Wert zurück. Stattdessen wird es mit einer CALL-Anweisung aufgerufen, um eine Operation auszuführen, z. B. das Ändern einer Tabelle oder das Verarbeiten abgerufener Datensätze.
- Eine Funktion wird innerhalb eines Ausdrucks aufgerufen und gibt einen einzelnen Wert direkt an den Aufrufer zurück, der im Ausdruck verwendet werden soll.
- Sie können weder eine Funktion mit einer CALL-Anweisung noch eine Prozedur in einem Ausdruck aufrufen.
Die Syntax für die Routineerstellung unterscheidet sich für Prozeduren und Funktionen etwas:
- Prozedurparameter können als Nur-Eingabe, Nur-Ausgabe oder beides definiert werden. Dies bedeutet, dass eine Prozedur mithilfe von Ausgabeparametern Werte an den Aufrufer zurückgeben kann. Auf diese Werte kann in Anweisungen zugegriffen werden, die auf die CALL-Anweisung folgen. Funktionen haben nur Eingabeparameter. Obwohl sowohl Prozeduren als auch Funktionen Parameter haben können, unterscheidet sich die Deklaration der Prozedurparameter von der für Funktionen.
Funktionen geben den Wert zurück, daher muss eine Funktionsdefinition eine RETURNS-Klausel enthalten, um den Datentyp des Rückgabewerts anzugeben. Außerdem muss mindestens eine RETURN-Anweisung im Funktionskörper vorhanden sein, um einen Wert an den Aufrufer zurückzugeben. RETURNS und RETURN erscheinen nicht in Prozedurdefinitionen.
Verwenden Sie die, um eine gespeicherte Prozedur aufzurufen CALL statement
. Um eine gespeicherte Funktion aufzurufen, verweisen Sie in einem Ausdruck darauf. Die Funktion gibt während der Ausdrucksauswertung einen Wert zurück.
Eine Prozedur wird mit einer CALL-Anweisung aufgerufen und kann Werte nur mit Ausgabevariablen zurückgeben. Eine Funktion kann wie jede andere Funktion aus einer Anweisung heraus aufgerufen werden (dh durch Aufrufen des Funktionsnamens) und einen skalaren Wert zurückgeben.
Die Angabe eines Parameters als IN, OUT oder INOUT gilt nur für ein PROCEDURE. Für eine FUNKTION werden Parameter immer als IN-Parameter betrachtet.
Wenn vor einem Parameternamen kein Schlüsselwort angegeben wird, handelt es sich standardmäßig um einen IN-Parameter.
Vor Parametern für gespeicherte Funktionen steht nicht IN, OUT oder INOUT. Alle Funktionsparameter werden als IN-Parameter behandelt.
Verwenden Sie zum Definieren einer gespeicherten Prozedur oder Funktion CREATE PROCEDURE bzw. CREATE FUNCTION:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Eine MySQL-Erweiterung für gespeicherte Prozeduren (keine Funktionen) besteht darin, dass eine Prozedur eine Ergebnismenge oder sogar mehrere Ergebnismengen generieren kann, die der Aufrufer auf dieselbe Weise wie das Ergebnis einer SELECT-Anweisung verarbeitet. Der Inhalt solcher Ergebnismengen kann jedoch nicht direkt im Ausdruck verwendet werden.
Gespeicherte Routinen (die sich sowohl auf gespeicherte Prozeduren als auch auf gespeicherte Funktionen beziehen ) sind genau wie Tabellen oder Ansichten einer bestimmten Datenbank zugeordnet. Wenn Sie eine Datenbank löschen, werden auch alle in der Datenbank gespeicherten Routinen gelöscht.
Gespeicherte Prozeduren und Funktionen haben nicht denselben Namespace. Es ist möglich, eine Prozedur und eine Funktion mit demselben Namen in einer Datenbank zu haben.
In gespeicherten Prozeduren kann dynamisches SQL verwendet werden, jedoch nicht in Funktionen oder Triggern.
SQL-vorbereitete Anweisungen (PREPARE, EXECUTE, DEALLOCATE PREPARE) können in gespeicherten Prozeduren verwendet werden, jedoch nicht in gespeicherten Funktionen oder Triggern. Daher können gespeicherte Funktionen und Trigger Dynamic SQL nicht verwenden (wobei Sie Anweisungen als Zeichenfolgen erstellen und diese dann ausführen). (Dynamisches SQL in gespeicherten MySQL-Routinen)
Einige weitere interessante Unterschiede zwischen FUNCTION und STORED PROCEDURE:
( Dieser Punkt wird aus einem Blogpost kopiert . ) Die gespeicherte Prozedur ist ein vorkompilierter Ausführungsplan, bei dem es sich nicht um Funktionen handelt. Funktion Zur Laufzeit analysiert und kompiliert. Gespeicherte Prozeduren, als Pseudocode in der Datenbank gespeichert, dh in kompilierter Form.
( Ich bin mir in diesem Punkt nicht sicher. )
Gespeicherte Prozeduren haben die Sicherheit und reduzieren den Netzwerkverkehr. Außerdem können wir gespeicherte Prozeduren in jeder beliebigen Nummer aufrufen. von Anwendungen zu einem Zeitpunkt. Referenz
Funktionen werden normalerweise für Berechnungen verwendet, wobei normalerweise Prozeduren zum Ausführen von Geschäftslogik verwendet werden.
Funktionen Kann den Status der Datenbank nicht beeinflussen (Anweisungen, die explizites oder implizites Festschreiben oder Zurücksetzen ausführen, sind in der Funktion nicht
zulässig ). Gespeicherte Prozeduren können den Status der Datenbank mithilfe von Festschreiben usw. beeinflussen. Aktualisierung: J.1. Einschränkungen für gespeicherte Routinen und Trigger
Funktionen können keine FLUSH- Anweisungen verwenden, während gespeicherte Prozeduren dies können.
Gespeicherte Funktionen können nicht rekursiv sein, während gespeicherte Prozeduren rekursiv sein können. Hinweis: Rekursive gespeicherte Prozeduren sind standardmäßig deaktiviert, können jedoch auf dem Server aktiviert werden, indem die Serversystemvariable max_sp_recursion_depth auf einen Wert ungleich Null gesetzt wird. Weitere Informationen finden Sie in Abschnitt 5.2.3, „Systemvariablen“ .
Innerhalb einer gespeicherten Funktion oder eines gespeicherten Triggers ist es nicht zulässig, eine Tabelle zu ändern, die bereits von der Anweisung, die die Funktion oder den Trigger aufgerufen hat, zum Lesen oder Schreiben verwendet wird. Gutes Beispiel: Wie aktualisiere ich dieselbe Tabelle beim Löschen in MYSQL?
Hinweis : Obwohl einige Einschränkungen normalerweise für gespeicherte Funktionen und Trigger gelten, jedoch nicht für gespeicherte Prozeduren, gelten diese Einschränkungen für gespeicherte Prozeduren, wenn sie aus einer gespeicherten Funktion oder einem gespeicherten Trigger heraus aufgerufen werden. Obwohl Sie FLUSH beispielsweise in einer gespeicherten Prozedur verwenden können, kann eine solche gespeicherte Prozedur nicht von einer gespeicherten Funktion oder einem gespeicherten Trigger aufgerufen werden.