Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gespeicherte MySQL-Prozedur vs. Funktion, welche würde ich wann verwenden?

Der allgemeinste Unterschied zwischen Prozeduren und Funktionen besteht darin, dass sie unterschiedlich und für unterschiedliche Zwecke aufgerufen werden:

  1. Eine Prozedur gibt keinen Wert zurück. Stattdessen wird es mit einer CALL-Anweisung aufgerufen, um eine Operation wie das Ändern einer Tabelle oder das Verarbeiten abgerufener Datensätze auszuführen.
  2. Eine Funktion wird innerhalb eines Ausdrucks aufgerufen und gibt einen einzelnen Wert direkt an den Aufrufer zurück, der im Ausdruck verwendet werden kann.
  3. Sie können weder eine Funktion mit einer CALL-Anweisung noch eine Prozedur in einem Ausdruck aufrufen.

Die Syntax für die Erstellung von Routinen unterscheidet sich etwas für Prozeduren und Funktionen:

  1. Prozedurparameter können als Nur-Eingabe, Nur-Ausgabe oder beides definiert werden. Das bedeutet, dass eine Prozedur mithilfe von Ausgabeparametern Werte an den Aufrufer zurückgeben kann. Auf diese Werte kann in Anweisungen zugegriffen werden, die der CALL-Anweisung folgen. Funktionen haben nur Eingabeparameter. Obwohl sowohl Prozeduren als auch Funktionen Parameter haben können, unterscheidet sich die Deklaration von Prozedurparametern daher von der für Funktionen.
  2. Rückgabewert von Funktionen, daher muss eine RETURNS-Klausel in einer Funktionsdefinition vorhanden sein, um den Datentyp des Rückgabewerts anzugeben. Außerdem muss mindestens eine RETURN-Anweisung im Funktionsrumpf vorhanden sein, um einen Wert an den Aufrufer zurückzugeben. RETURNS und RETURN erscheinen nicht in Prozedurdefinitionen.

    • Um eine gespeicherte Prozedur aufzurufen, verwenden Sie die 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 über Ausgabevariablen zurückgeben. Eine Funktion kann wie jede andere Funktion innerhalb einer Anweisung aufgerufen werden (d. h. durch Aufrufen des Funktionsnamens) und einen Skalarwert zurückgeben.

    • Die Angabe eines Parameters als IN, OUT oder INOUT ist nur für eine PROCEDURE gültig. Bei einer FUNCTION werden Parameter immer als IN-Parameter betrachtet.

    Wenn vor einem Parameternamen kein Schlüsselwort angegeben ist, handelt es sich standardmäßig um einen IN-Parameter. Parametern für gespeicherte Funktionen wird kein IN, OUT oder INOUT vorangestellt. Alle Funktionsparameter werden als IN-Parameter behandelt.

Um eine gespeicherte Prozedur oder Funktion zu definieren, verwenden Sie 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 (nicht Funktionen) besteht darin, dass eine Prozedur eine Ergebnismenge oder sogar mehrere Ergebnismengen generieren kann, die der Aufrufer auf die gleiche Weise wie das Ergebnis einer SELECT-Anweisung verarbeitet. Der Inhalt solcher Ergebnismengen kann jedoch nicht direkt in Ausdrücken verwendet werden.

Gespeicherte Routinen (bezieht sich sowohl auf gespeicherte Prozeduren als auch auf gespeicherte Funktionen) sind einer bestimmten Datenbank zugeordnet, genau wie Tabellen oder Ansichten. Wenn Sie eine Datenbank löschen, werden auch alle gespeicherten Routinen in der Datenbank gelöscht.

Gespeicherte Prozeduren und Funktionen teilen sich 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, aber nicht in Funktionen oder Triggern.

Vorbereitete SQL-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 kein dynamisches SQL verwenden (wo 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:

  1. (Dieser Punkt ist aus einem Blogpost kopiert . ) Die gespeicherte Prozedur ist ein vorkompilierter Ausführungsplan, während as-Funktionen dies nicht sind. Funktion Zur Laufzeit analysiert und kompiliert. Gespeicherte Prozeduren, als Pseudocode in der Datenbank gespeichert, d. h. in kompilierter Form.

  2. (Ich bin mir bei diesem Punkt nicht sicher. )
    Gespeicherte Prozeduren haben die Sicherheit und reduzieren den Netzwerkverkehr und wir können gespeicherte Prozeduren in jeder beliebigen Nr. aufrufen. von Anwendungen auf einmal. Referenz

  3. Funktionen werden normalerweise für Berechnungen verwendet, während Prozeduren normalerweise zum Ausführen von Geschäftslogik verwendet werden.

  4. Funktionen können den Status der Datenbank nicht beeinflussen (Anweisungen, die explizites oder implizites Commit oder Rollback ausführen, sind in der Funktion nicht zulässig). Wohingegen gespeicherte Prozeduren den Status der Datenbank mit Commit usw. beeinflussen können.
    Referenz:J.1. Einschränkungen für gespeicherte Routinen und Trigger

  5. Funktionen können FLUSH nicht verwenden Anweisungen, während gespeicherte Prozeduren dies tun können.

  6. Gespeicherte Funktionen können nicht rekursiv sein, während gespeicherte Prozeduren dies können. Siehe Abschnitt 5.2.3 , „Systemvariablen“ , für weitere Informationen.

  7. Innerhalb einer gespeicherten Funktion oder eines Triggers ist es nicht erlaubt, eine Tabelle zu ändern, die bereits (zum Lesen oder Schreiben) von der Anweisung verwendet wird, die die Funktion oder den Trigger aufgerufen hat. Gutes Beispiel:Wie aktualisiere ich dieselbe Tabelle beim Löschen in MYSQL?

Hinweis Hinweis:Obwohl einige Einschränkungen normalerweise für gespeicherte Funktionen und Trigger gelten, aber nicht für gespeicherte Prozeduren, gelten diese Einschränkungen für gespeicherte Prozeduren, wenn sie aus einer gespeicherten Funktion oder einem Trigger heraus aufgerufen werden. Obwohl Sie beispielsweise FLUSH in einer gespeicherten Prozedur verwenden können, kann eine solche gespeicherte Prozedur nicht von einer gespeicherten Funktion oder einem Trigger aufgerufen werden.