Heim  >  Artikel  >  Datenbank  >  Benutzerdefinierte MySQL-Funktion

Benutzerdefinierte MySQL-Funktion

黄舟
黄舟Original
2017-02-27 13:32:363023Durchsuche


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:

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
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)
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 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> 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 4
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)
Ü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.
  • 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 (www.php.cn)!
Stellungnahme:
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