Benutzerdefinierte Funktion:
Benutzerdefinierte Funktion (UDF) ist eine Möglichkeit, MySQL zu erweitern. Ihre Verwendung ist die gleiche wie die der integrierten Funktionen sind gleich.
Es gibt zwei notwendige Bedingungen für eine benutzerdefinierte Funktion:
1. Parameter
2. Rückgabewert
Die Funktion kann jede Art von Wert zurückgeben und auch empfangen diese Parameter.
Es besteht kein notwendiger interner Zusammenhang zwischen Funktionsparametern und Rückgabewert.
Beispiel 1:
Erstellen Sie eine parameterlose Funktion, die die aktuelle Uhrzeit, das Jahr, den Monat, den Tag, die Stunden, Minuten und Sekunden zurückgibt.
Zum Beispiel:
mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2016-09-08 21:17:17 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); +--------------------------------------------------+ | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') | +--------------------------------------------------+ | 2016年09月08日 21点:19分:54秒 | +--------------------------------------------------+ 1 row in set (0.01 sec)
Kapseln Sie den obigen Prozess:
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30) -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');Query OK, 0 rows affected (0.08 sec) mysql> SELECT f1(); +-------------------------------+ | f1() | +-------------------------------+ | 2016年09月08日 21点:21分:25秒 | +-------------------------------+ 1 row in set (0.02 sec)
Hinweis: Was auf „returns“ folgt, ist der Rückgabewerttyp, und was auf „return“ folgt, ist der Rückgabewert.
Beispiel 2:
Erstellen Sie eine Funktion mit Parametern, beispielsweise zum Ermitteln des Durchschnitts zweier Zahlen.
mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) -> RETURNS FLOAT(10,2) UNSIGNED -> RETURN (num1+num2)/2;Query OK, 0 rows affected (0.00 sec)
Aufruf:
mysql> SELECT f2(4,6); +---------+ | f2(4,6) | +---------+ | 5.00 | +---------+ 1 row in set (0.02 sec)
Wenn Sie die beiden oben erstellten benutzerdefinierten Funktionen löschen möchten:
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)
Erstellen Sie eine benutzerdefinierte Funktion mit einer zusammengesetzten Strukturfunktion body Funktion definieren
Zum Beispiel: Erstellen Sie eine Funktion, um Daten in die Tabelle einzufügen und die ID der eingefügten Daten zurückzugeben.
mysql> DESC tdb_test; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | NO | | NULL | | | last_name | varchar(20) | NO | | NULL | | +------------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name)' at line 4
Zu diesem Zeitpunkt haben wir festgestellt, dass nach Eingabe der auszuführenden SQL-Anweisung das folgende Semikolon das aktuelle Standardtrennzeichen ist, was dazu führt, dass die Funktion die Eingabe nicht fortsetzen kann. Daher muss das Standardtrennzeichen geändert werden.
mysql> DELIMITER //
bedeutet, mit // zu enden.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> LAST_INSERT_ID(); -> // ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name); LAST_INSERT_ID()' at line 4
gibt auch einen Fehler zurück, da zwei Anweisungen ausgeführt werden müssen und Anfang und Ende eingefügt werden müssen, um ein Aggregat zu bilden , wie folgt Schauen wir uns den richtigen Ansatz an.
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> BEGIN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> RETURN LAST_INSERT_ID(); -> END -> // Query OK, 0 rows affected (0.00 sec)
Ändern Sie dann das Trennzeichen wieder in
mysql> DELIMITER ;
Die Testergebnisse lauten wie folgt:
mysql> SELECT adduser("ttt","ddd"); +----------------------+ | adduser("ttt","ddd") | +----------------------+ | 5 | +----------------------+ 1 row in set (0.11 sec) mysql> SELECT * FROM tdb_test; +----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | A | B | | 2 | Jack | Bob | | 3 | tom% | 123 | | 4 | 11 | 22 | | 5 | ttt | ddd | +----+------------+-----------+ 5 rows in set (0.00 sec)
Über den Funktionskörper
Der Funktionskörper besteht aus gültigen SQL-Anweisungen;
Der Funktionskörper kann eine einfache SELECT- oder INSERT-Anweisung sein; >Wenn der Funktionskörper aus zusammengesetzten Strukturen besteht, verwenden Sie die BEGIN...END-Anweisung.
Zusammengesetzte Strukturen können Deklarationen, Schleifen und Kontrollstrukturen enthalten
Funktionen löschen:Benutzerdefinierte Funktion:
DROP FUNCTION [IF EXISTS] function_nameEs gibt zwei notwendige Bedingungen für eine benutzerdefinierte Funktion:
1. Parameter
2. RückgabewertEs besteht keine notwendige interne Verbindung zwischen Funktionsparametern und Rückgabewert.Die Funktion kann jede Art von Wert zurückgeben und auch empfangen diese Parameter.
Beispiel 1:
Erstellen Sie eine parameterlose Funktion, die die aktuelle Uhrzeit, das Jahr, den Monat, den Tag, die Stunden, Minuten und Sekunden zurückgibt.
Kapseln Sie den obigen Prozess:
Hinweis: Was auf „returns“ folgt, ist der Rückgabewerttyp, und was auf „return“ folgt, ist der Rückgabewert.
mysql> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2016-09-08 21:17:17 | +---------------------+ 1 row in set (0.00 sec) mysql> SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒'); +--------------------------------------------------+ | DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') | +--------------------------------------------------+ | 2016年09月08日 21点:19分:54秒 | +--------------------------------------------------+ 1 row in set (0.01 sec)Erstellen Sie eine Funktion mit Parametern, beispielsweise zum Ermitteln des Durchschnitts zweier Zahlen.
mysql> CREATE FUNCTION f1() RETURNS VARCHAR(30) -> RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');Query OK, 0 rows affected (0.08 sec) mysql> SELECT f1();+-------------------------------+| f1() | +-------------------------------+| 2016年09月08日 21点:21分:25秒 | +-------------------------------+1 row in set (0.02 sec)Aufruf:
Wenn Sie die beiden oben erstellten benutzerdefinierten Funktionen löschen möchten:
mysql> CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) -> RETURNS FLOAT(10,2) UNSIGNED -> RETURN (num1+num2)/2;Query OK, 0 rows affected (0.00 sec)Erstellen Sie eine benutzerdefinierte Funktion mit einer zusammengesetzten Strukturfunktion body Funktion definieren Zum Beispiel: Erstellen Sie eine Funktion, um Daten in die Tabelle einzufügen und die ID der eingefügten Daten zurückzugeben.
mysql> SELECT f2(4,6);+---------+| f2(4,6) | +---------+| 5.00 | +---------+1 row in set (0.02 sec)Zu diesem Zeitpunkt haben wir festgestellt, dass nach Eingabe der auszuführenden SQL-Anweisung das folgende Semikolon das aktuelle Standardtrennzeichen ist, was dazu führt, dass die Funktion die Eingabe nicht fortsetzen kann. Daher muss das Standardtrennzeichen geändert werden.
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)bedeutet, mit // zu enden.
mysql> DESC tdb_test; +------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(20) | NO | | NULL | | | last_name | varchar(20) | NO | | NULL | | +------------+------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec) mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name)' at line 4gibt auch einen Fehler zurück, da zwei Anweisungen ausgeführt werden müssen und Anfang und Ende eingefügt werden müssen, um ein Aggregat zu bilden , wie folgt Schauen wir uns den richtigen Ansatz an.
mysql> DELIMITER //Ändern Sie dann das Trennzeichen wieder in
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> RETURN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> LAST_INSERT_ID(); -> // ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'tdb_test(first_name,last_name) VALUES(first_name,last_name); LAST_INSERT_ID()' at line 4Die Testergebnisse lauten wie folgt:
mysql> CREATE FUNCTION adduser(first_name VARCHAR(20),last_name VARCHAR(20)) -> RETURNS INT UNSIGNED -> BEGIN -> INSERT tdb_test(first_name,last_name) VALUES(first_name,last_name); -> RETURN LAST_INSERT_ID(); -> END -> // Query OK, 0 rows affected (0.00 sec)Über den Funktionskörper
mysql> DELIMITER ;
Der Funktionskörper besteht aus gültigen SQL-Anweisungen;
mysql> SELECT adduser("ttt","ddd"); +----------------------+ | adduser("ttt","ddd") | +----------------------+ | 5 | +----------------------+ 1 row in set (0.11 sec) mysql> SELECT * FROM tdb_test; +----+------------+-----------+ | id | first_name | last_name | +----+------------+-----------+ | 1 | A | B | | 2 | Jack | Bob | | 3 | tom% | 123 | | 4 | 11 | 22 | | 5 | ttt | ddd | +----+------------+-----------+ 5 rows in set (0.00 sec)Der Funktionskörper kann eine einfache SELECT- oder INSERT-Anweisung sein; >Wenn der Funktionskörper aus zusammengesetzten Strukturen besteht, verwenden Sie die BEGIN...END-Anweisung.