Maison > base de données > tutoriel mysql > Fonction personnalisée MySQL

Fonction personnalisée MySQL

黄舟
Libérer: 2017-02-27 13:32:36
original
3035 Les gens l'ont consulté


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)
Copier après la connexion
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

Appel :

mysql> SELECT f2(4,6);
+---------+
| f2(4,6) |
+---------+
|    5.00 |
+---------+
1 row in set (0.02 sec)
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

À 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 //
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

Ensuite, remettez le délimiteur en

mysql> DELIMITER ;
Copier après la connexion
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

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

La fonction définie par l'utilisateur (UDF) est un moyen d'étendre MySQL, et son utilisation est la même que celle intégrée -en fonction.

DROP FUNCTION [IF EXISTS] function_name
Copier après la connexion
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 :

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.

Exemple 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)
Copier après la connexion
Copier après la connexion
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)
Copier après la connexion
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)
Copier après la connexion
Copier après la connexion
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)
Copier après la connexion

À 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)
Copier après la connexion
Copier après la connexion

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 4
Copier après la connexion
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> DELIMITER //
Copier après la connexion
Copier après la connexion
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 4
Copier après la connexion
Les 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)
Copier après la connexion
Copier après la connexion
À propos du corps fonctionnel

mysql> DELIMITER ;
Copier après la connexion
Copier après la connexion

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)
Copier après la connexion
Copier après la connexion

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
  • 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) !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal