Heim > Datenbank > MySQL-Tutorial > Benutzerdefinierte MySQL-Funktion

Benutzerdefinierte MySQL-Funktion

黄舟
Freigeben: 2017-02-27 13:32:36
Original
3040 Leute haben es durchsucht


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)
Nach dem Login kopieren
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

Aufruf:

mysql> SELECT f2(4,6);
+---------+
| f2(4,6) |
+---------+
|    5.00 |
+---------+
1 row in set (0.02 sec)
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren

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 //
Nach dem Login kopieren
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

Ändern Sie dann das Trennzeichen wieder in

mysql> DELIMITER ;
Nach dem Login kopieren
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

Ü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:

Benutzerdefinierte Funktion (UDF) ist eine Möglichkeit, MySQL zu erweitern, und ihre Verwendung ist die gleiche wie die der erstellten -in-Funktion.

DROP FUNCTION [IF EXISTS] function_name
Nach dem Login kopieren
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 keine notwendige interne Verbindung 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:

Kapseln Sie den obigen Prozess:


Hinweis: Was auf „returns“ folgt, ist der Rückgabewerttyp, und was auf „return“ folgt, ist der Rückgabewert.

Beispiel 2:
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)
Nach dem Login kopieren
Nach dem Login kopieren
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)
Nach dem Login kopieren
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)
Nach dem Login kopieren
Nach dem Login kopieren
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)
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

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 4
Nach dem Login kopieren
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> DELIMITER //
Nach dem Login kopieren
Nach dem Login kopieren
Ä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 4
Nach dem Login kopieren
Die 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)
Nach dem Login kopieren
Nach dem Login kopieren
Über den Funktionskörper

mysql> DELIMITER ;
Nach dem Login kopieren
Nach dem Login kopieren

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)
Nach dem Login kopieren
Nach dem Login kopieren

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:
  • Das Obige ist der Inhalt der benutzerdefinierten MySQL-Funktionen. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (m.sbmmt.com)!
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage