Syntax
Beschreibung
Erstellt eine gespeicherte Prozedur. Standardmäßig ist eine Routine mit der Standarddatenbank verknüpft. Um die Routine implizit einer bestimmten Datenbank zuzuordnen, geben Sie den Namen als db_name an.sp_namewhen Sie es erstellen.
Wenn die Routine aufgerufen wird, wird eine implizite VERWENDUNG db_name ausgeführt (undundone, wenn die Routine beendet wird). Die bewirkt, dass die Routine die angegebene Standarddatenbank hat, während sie ausgeführt wird. USE Anweisungen withinstored Routinen sind nicht zulässig.,
Wenn eine gespeicherte Prozedur erstellt wurde, rufen Sie sie mit der CALL
– Anweisung auf (siehe AUFRUF).
Um die Anweisung CREATE PROCEDURE
auszuführen, ist es nicht erforderlich, die Berechtigung zu haben. Standardmäßig gewährt mariadbautomatisch die Berechtigungen ALTER ROUTINE
und EXECUTE
theroutine creator. Siehe auch Gespeicherte Routinerechte.,
DieDEFINER
– und SQL-Sicherheitsklauseln geben den Sicherheitskontext an, der bei der Überprüfung der Zugriffsrechte zur Routineausführungszeit verwendet werden soll, wie später beschrieben. Erfordert das SUPER-Privileg oder ab MariaDB 10.5.2 das SET USER-Privileg.
Wenn der Routinenname mit dem Namen einer integrierten SQLfunction übereinstimmt, müssen Sie bei der Definition der Routine ein Leerzeichen zwischen dem Namen und der followingparenthesis verwenden, oder es tritt ein Syntaxfehler auf. Dies gilt auch, wenn Sie die Routine später aufrufen., Aus diesem Grund sollten Sie vermeiden, die Namen vorhandener Sqlfunktionen für Ihre eigenen gespeicherten Routinen erneut zu verwenden.
Der SQL-Modus IGNORE_SPACE gilt für integrierte Funktionen, nicht für Storedroutinen. Es ist immer zulässig, Leerzeichen nach einem Routinenamen zu haben, unabhängig davon, ob IGNORE_SPACE aktiviert ist.
Die in Klammern eingeschlossene Parameterliste muss immer vorhanden sein.Wenn keine Parameter vorhanden sind, sollte eine leere Parameterliste von () verwendet werden. Parameternamen sind nicht groß – / Kleinschreibung.,
Jeder Parameter kann so deklariert werden, dass er einen beliebigen gültigen Datentyp verwendet, mit der Ausnahme, dass das Attribut COLLATE nicht verwendet werden kann.
Gültige Bezeichner, die als Prozedurnamen verwendet werden sollen, finden Sie unter Bezeichnernamen.
IN/OUT/INOUT
Jeder parameter ist ein IN
parameter standardmäßig. Um den fora-Parameter anzugeben, verwenden Sie vor dem Parameternamen das Schlüsselwort OUT
oder INOUT
.
Ein IN
parameter übergibt einen Wert in einer Prozedur., Die Prozedur kann den Wert ändern, aber die Änderung ist für den Aufrufer nicht sichtbar, wenn die Prozedur zurückkehrt. EinOUT
Parameter übergibt einen Wert von theprocedure zurück an den Aufrufer. Sein Anfangswert ist NULL innerhalb theprocedure,und sein Wert ist für den Aufrufer sichtbar, wenn das procedurereturns. EinINOUT
Parameter wird vom Aufrufer initialisiert, kann durch die Prozedur modifiziert werden, und jede durch die Prozedur vorgenommene Änderung ist für den Aufrufer sichtbar, wenn die Prozedur zurückkehrt.,
Übergeben Sie für jeden OUT
oder INOUT
Parameter eine benutzerdefinierte Variable in derCALL
Anweisung, die die Prozedur aufruft, damit Sie ihren Wert erhalten können, wenn die Prozedur zurückkehrt. Wenn Sie das procedurefrom innerhalb einer anderen gespeicherten Prozedur oder Funktion aufrufen, können Sie auch einen Parameter oder eine lokale Routinevariable als IN
oder INOUT
Parameter übergeben.
DETERMINISTISCH / NICHT DETERMINISTISCH
DETERMINISTIC
und NOT DETERMINISTIC
gelten nur für Funktionen., Die Angabe von DETERMINISTC
oder NON-DETERMINISTIC
in Prozeduren hat keine Auswirkung. Der Standardwert ist NOT DETERMINISTIC
. Funktionen sind DETERMINISTIC
wenn sie immer den gleichen Wert für dieselbe Eingabe zurückgeben. Zum Beispiel eine Truncate-oder Substring-Funktion. Jede Funktion, die Daten enthält, ist daher immer NOT DETERMINISTIC
.,
ENTHÄLT SQL / NO SQL / LIEST SQL-DATEN / ÄNDERT SQL-DATEN
CONTAINS SQL
, NO SQL
, und MODIFIES SQL DATA
sind informative Klauseln, die dem Server mitteilen, was die Funktion tut. MariaDB überprüft in keiner Weise, ob die angegebene Klausel korrekt ist. Wenn keine dieser Klauseln angegeben ist, wird standardmäßig CONTAINS SQL
verwendet.
MODIFIES SQL DATA
bedeutet, dass die Funktion Anweisungen enthält, die in Datenbanken gespeicherte Daten ändern können., Dies geschieht, wenn die Funktion Anweisungen wie DELETE, UPDATE, INSERT, REPLACE oder DDL enthält.
bedeutet, dass die Funktion in Datenbanken gespeicherte Daten liest, aber keine Daten ändert. Dies geschieht, wenn SELECT-Anweisungen verwendet werden, dort jedoch keine Schreibvorgänge ausgeführt werden.
CONTAINS SQL
bedeutet, dass die Funktion mindestens eine SQL-Anweisung enthält, aber keine in einer Datenbank gespeicherten Daten liest oder schreibt. Beispiele sind SET oder DO.,
NO SQL
bedeutet nichts, da MariaDB derzeit keine andere Sprache als SQL unterstützt.
Der routine_body besteht aus einer gültigen SQL procedure Anweisung. Diese sind eine einfache Anweisung wie SELECT oder EINFÜGEN, oder es kann acompound-Anweisung geschrieben mit BEGIN und END. Zusammengesetzte statementscan enthalten Deklarationen, Schleifen und andere Control structurestatements. Siehe Programmatische und zusammengesetzte Anweisungen für Syntaxdetails.
Mit MariaDB können Routinen DDL-Anweisungen enthalten, z. B. CREATE
androp., MariaDB erlaubt auch gespeicherten Prozeduren (aber nicht gespeicherten Funktionen)SQL-Transaktionsanweisungen wie COMMIT
enthalten.
Weitere Informationen zu Anweisungen, die in gespeicherten Routinen nicht zulässig sind, finden Sie unter Einschränkungen für gespeicherte Routinen.
Aufrufen gespeicherter Prozeduren aus Programmen
Informationen zum Aufrufen gespeicherter Prozeduren aus Programmen, die in einer Sprache mit MariaDB / MySQL-Schnittstelle geschrieben sind, finden Sie unter AUFRUFEN.
ODER ERSETZEN Sie
MariaDB ab 10.1.,3
Wenn die optionale Klausel OR REPLACE
verwendet wird, fungiert sie als Abkürzung für:
DROP PROCEDURE IF EXISTS name;CREATE PROCEDURE name ...;
mit der Ausnahme, dass vorhandene Berechtigungen für die Prozedur nicht gelöscht werden.
sql_mode
MariaDB speichert die Systemvariableneinstellung sql_mode, die zum Zeitpunkt der Erstellung einer Routine wirksam ist, und führt die Routine immer mit dieser Einstellung aus, unabhängig vom Server-SQL-Modus, der beim Aufrufen der Routine wirksam ist.
Zeichensätze und Sortierreihen
Prozedurparameter können mit jedem Zeichensatz/Sortierreihenfolge deklariert werden., Wenn der Zeichensatz und die Sortierung nicht speziell festgelegt sind, werden die Datenbankeinstellungen zum Zeitpunkt der Erstellung verwendet. Wenn sich die Standardeinstellungen der Datenbank zu einem späteren Zeitpunkt ändern, wird der Zeichensatz/die Sortierung der gespeicherten Prozedur nicht gleichzeitig geändert.Die gespeicherte Prozedur muss gelöscht und neu erstellt werden, um sicherzustellen, dass derselbe Zeichensatz/dieselbe Sortierung wie die Datenbank verwendet wird.
Oracle Mode
MariaDB ab 10.3
Ab MariaDB 10.3 wurde zusätzlich zur traditionellen SQL/PSM-basierten MariaDB-Syntax eine Teilmenge der PL / SQL-Sprache von Oracle unterstützt., Einzelheiten zu Änderungen beim Ausführen des Oracle-Modus finden Sie unter Oracle mode von MariaDB 10.3.
Beispiele
Das folgende Beispiel zeigt eine einfache gespeicherte Prozedur, die einen OUT
Parameter verwendet. Es verwendet den Befehl DELIMITER, um ein neues Trennzeichen für die Dauer des Prozesses festzulegen — siehe Trennzeichen im MySQL-Client.,
Zeichensatz und Sortierfolge:
CREATE or REPLACE:
Siehe Auch
- Bezeichner-Namen
- Gespeicherte Prozedur Übersicht
- ALTER PROCEDURE
- DROP PROCEDURE
- SHOW CREATE PROCEDURE
- SHOW PROCEDURE STATUS
- Gespeichert Routine Berechtigungen
- Informationen-Schema-ROUTINEN Tabelle