Maison >base de données >tutoriel mysql >Fonction personnalisée MySQL
Fonction personnalisée :
La fonction définie par l'utilisateur (UDF) est un moyen d'étendre MySQL. Son utilisation est la même que celle des fonctions intégrées. sont les mêmes.
Il y a deux conditions nécessaires pour une fonction personnalisée :
1. Paramètres
2. Valeur de retour
La fonction peut renvoyer n'importe quel type de valeur et peut également recevoir. ces types de paramètres.
Il n'y a pas de connexion interne nécessaire entre les paramètres de la fonction et la valeur de retour.
Exemple 1 :
Créez une fonction sans paramètre qui renvoie l'heure, l'année, le mois, le jour, les heures, les minutes et les secondes actuelles.
Par exemple :
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)
Encapsulez le processus ci-dessus :
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)
Remarque : ce qui suit return est le type de valeur de retour, et ce qui suit return est la valeur de retour.
Exemple 2 :
Créez une fonction avec des paramètres, comme trouver la moyenne de deux nombres.
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)
Appel :
mysql> SELECT f2(4,6); +---------+ | f2(4,6) | +---------+ | 5.00 | +---------+ 1 row in set (0.02 sec)
Si vous souhaitez supprimer les deux fonctions personnalisées créées ci-dessus :
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)
Créez une fonction personnalisée avec une fonction de structure composite body Définir la fonction
Par exemple : Créez une fonction pour insérer des données dans la table et renvoyer l'identifiant des données insérées.
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
À ce moment-là, nous avons constaté qu'après avoir entré l'instruction SQL à exécuter, le point-virgule suivant est le séparateur par défaut actuel, ce qui empêche la fonction de continuer la saisie. Le délimiteur par défaut doit donc être modifié.
mysql> DELIMITER //
signifie se terminer par //
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
renvoie également une erreur, car il y a deux instructions à exécuter, et le début et la fin doivent être mis pour former un agrégat , comme suit Regardons la bonne approche.
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)
Ensuite, remettez le délimiteur en
mysql> DELIMITER ;
Les résultats du test sont les suivants :
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)
À propos du corps fonctionnel
Le corps de la fonction est constitué d'instructions SQL légales
Le corps de la fonction peut être une simple instruction SELECT ou INSERT ; >Si le corps de la fonction est constitué de structures composites, utilisez l'instruction BEGIN...END
Les structures composées peuvent contenir des déclarations, des boucles et des structures de contrôle ;
Fonctions de suppression :Fonction personnalisée :
DROP FUNCTION [IF EXISTS] function_nameIl y a deux conditions nécessaires pour une fonction personnalisée :
1. Paramètres
2. Valeur de retourIl n'y a pas de connexion interne nécessaire entre les paramètres de la fonction et la valeur de retour.La fonction peut renvoyer n'importe quel type de valeur et peut également recevoir. ces types de paramètres.
Exemple 1 :
Créez une fonction sans paramètre qui renvoie l'heure, l'année, le mois, le jour, les heures, les minutes et les secondes actuelles.
Encapsulez le processus ci-dessus :
Remarque : ce qui suit return est le type de valeur de retour, et ce qui suit return est la valeur de retour.
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)Créez une fonction avec des paramètres, comme trouver la moyenne de deux nombres.
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)Appel :
Si vous souhaitez supprimer les deux fonctions personnalisées créées ci-dessus :
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)Créez une fonction personnalisée avec une fonction de structure composite body Définir la fonction Par exemple : Créez une fonction pour insérer des données dans la table et renvoyer l'identifiant des données insérées.
mysql> SELECT f2(4,6);+---------+| f2(4,6) | +---------+| 5.00 | +---------+1 row in set (0.02 sec)À ce moment-là, nous avons constaté qu'après avoir entré l'instruction SQL à exécuter, le point-virgule suivant est le séparateur par défaut actuel, ce qui empêche la fonction de continuer la saisie. Le délimiteur par défaut doit donc être modifié.
mysql> DROP FUNCTION f2;Query OK, 0 rows affected (0.11 sec) mysql> DROP FUNCTION f1;Query OK, 0 rows affected (0.00 sec)signifie se terminer par //
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 4renvoie également une erreur, car il y a deux instructions à exécuter, et le début et la fin doivent être mis pour former un agrégat. , comme suit Regardons la bonne approche.
mysql> DELIMITER //Ensuite, remettez le délimiteur en
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 4Les résultats du test sont les suivants :
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)À propos du corps fonctionnel
mysql> DELIMITER ;
Le corps de la fonction est constitué d'instructions SQL légales
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)Le corps de la fonction peut être une simple instruction SELECT ou INSERT ; >Si le corps de la fonction est constitué de structures composites, utilisez l'instruction BEGIN...END
Supprimer des fonctions :
Ce qui précède est le contenu des fonctions personnalisées MySQL. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !