Maison  >  Article  >  base de données  >  Introduction détaillée aux fonctions personnalisées et aux procédures stockées MySQL (avec code)

Introduction détaillée aux fonctions personnalisées et aux procédures stockées MySQL (avec code)

不言
不言avant
2019-04-15 11:48:392104parcourir

Cet article vous apporte une introduction détaillée aux fonctions personnalisées et aux procédures stockées de MySQL (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Conditions préalables

La table user_info existe dans la base de données MySQL. Sa structure et ses données sont les suivantes :

mysql> desc  user_info;
+-----------+----------+------+-----+---------+-------+
| Field     | Type     | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| id        | int(10)  | NO   | PRI | NULL    |       |
| name      | char(20) | NO   |     | NULL    |       |
| passwd    | char(40) | NO   |     | NULL    |       |
| email     | char(20) | NO   |     | NULL    |       |
| phone     | char(20) | NO   |     | NULL    |       |
| role      | char(10) | NO   |     | NULL    |       |
| sex       | char(10) | NO   |     | NULL    |       |
| status    | int(10)  | NO   |     | NULL    |       |
| createAt  | datetime | NO   |     | NULL    |       |
| exprAt    | datetime | NO   |     | NULL    |       |
| validDays | int(10)  | NO   |     | NULL    |       |
| delAt     | datetime | YES  |     | NULL    |       |
+-----------+----------+------+-----+---------+-------+
12 rows in set (0.10 sec)

mysql> select  * from  user_info;
+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+
| id | name         | passwd   | email      | phone       | role   | sex  | status | createAt            | exprAt              | validDays | delAt |
+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+
|  1 | StephenWang7 | py123456 | 123@qq.com | 15103887470 | admin  | male |    200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 |        30 | NULL  |
|  2 | StephenWang8 | 123456   | 123@qq.com | 15103887470 | viewer | male |    200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 |        30 | NULL  |
+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+
2 rows in set (0.00 sec)

2. function

Fonction : Une collection de SQL qui peut remplir une fonction spécifique. MySQL prend en charge des fonctions personnalisées pour compléter des fonctions métier spécifiques.
La syntaxe pour créer une fonction personnalisée (User Defined Function (UDF en abrégé)) est la suivante :

create function <函数名称> ([参数1] [类型1], [参数N] [类型N])
returns <类型>
return 
<函数主体>

La syntaxe pour appeler UDF est la suivante :

select  <函数名称> ([参数])

Créer une UDF sans paramètres

Exemple 1 : Rechercher combien d'enregistrements il y a dans la table user_info

#定义函数
mysql> create function  user_info_count()
    -> returns int(10)
    -> return
    -> (select  count(*) from user_info);

Appeler la fonction user_info_count()

mysql> select  user_info_count();
+-------------------+
| user_info_count() |
+-------------------+
|                 2 |
+-------------------+
1 row in set (0.00 sec)

Créer un UDF paramétré

Exemple 2 : Requête du nom d'utilisateur en fonction de l'identifiant.

#定义函数
mysql> create function  queryNameById(uid int(10))
    -> returns char(20)
    -> return
    -> (select  name  from   user_info  where id=uid);
Query OK, 0 rows affected (0.01 sec)

Appelez la fonction pour interroger le nom d'utilisateur avec l'identifiant 1.

mysql> select  queryNameById(1);
+------------------+
| queryNameById(1) |
+------------------+
| StephenWang7     |
+------------------+
1 row in set (0.00 sec)

Afficher l'UDF

Interroger toutes les UDF du système

show function status;

Interroger l'UDF spécifiée

#
show   create function   函数名称;
mysql> show  function   queryNameById;
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 &#39;queryNameById&#39; at line 1
mysql> show  function   queryNameById();
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 &#39;queryNameById()&#39; at line 1
mysql> show   create function   queryNameById();
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 &#39;()&#39; at line 1
mysql> show   create function   queryNameById;
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Function      | sql_mode                                                                                                                                  | Create Function                                                                                                                                               | character_set_client | collation_connection | Database Collation |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| queryNameById | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` FUNCTION `queryNameById`(uid int(10)) RETURNS char(20) CHARSET latin1
return (select  name  from   user_info  where id=uid) | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec

Modifier l'UDF

Si vous souhaitez modifier le contenu de la fonction, supprimez-la d'abord puis recréez-la.

Supprimer l'UDF

La syntaxe de suppression de l'UDF est la suivante :

drop function  <函数名称>;

Exemple 3 : Après avoir supprimé la fonction queryNameId, appelez-la à nouveau et observez le phénomène.

mysql> drop  function queryNameById;
Query OK, 0 rows affected (0.45 sec)

mysql> select queryNameById(1);
ERROR 1305 (42000): FUNCTION rms.queryNameById does not exist
mysql>

3. Procédure stockée

La fonction de stockage est similaire à la fonction personnalisée, et c'est également un ensemble d'instructions SQL qui remplissent des fonctions spécifiques. Écrivez à l'avance du SQL complexe ou fréquemment appelé et spécifiez un nom. Lorsque vous souhaitez l'utiliser, appelez-le directement.
La syntaxe pour définir une procédure stockée est la suivante :

CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名> <类型>
#语法定义来自:http://c.biancheng.net/view/2593.html

Créer une procédure stockée sans paramètres

Exemple 4 : Requête du nom d'utilisateur.

mysql> DELIMITER //
mysql> craete procedure queryName()
    -> begin
    -> select  name from user_info;
    -> end //

Concernant la commande DELIMITER, modifiez le caractère de la commande de fin MySQL. Le caractère de commande de fin par défaut est un point-virgule. Lorsque la procédure stockée contient plusieurs instructions, le premier point-virgule rencontré sera utilisé comme signe de fin de la procédure stockée. Ce n'est pas comme prévu, le caractère de commande de fin par défaut doit donc être modifié. DELIMITER //Changez simplement le caractère de fin de la commande en //. La commande pour appeler une procédure stockée est la suivante : appeler le nom de la procédure stockée.

#此时的命令的结束符号为// 不是;
mysql> call  queryName()//
+--------------+
| name         |
+--------------+
| StephenWang7 |
| StephenWang8 |
+--------------+
2 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Créer une procédure stockée avec des paramètres

Exemple 5 : Nom de requête basé sur l'identifiant.

mysql> create procedure  queryNameById
    -> (In uid int(15))
    -> begin
    -> select  name  from  user_info where id=uid;
    -> end
    -> //
Query OK, 0 rows affected (0.03 sec)

Appelez la procédure stockée queryNameById

mysql> call queryNameById(1);
    -> //
+--------------+
| name         |
+--------------+
| StephenWang7 |
+--------------+
1 row in set (0.03 sec)

Query OK, 0 rows affected (0.04 sec)

Modifiez la procédure stockée

Si vous souhaitez créer le contenu de la procédure stockée, vous pouvez supprimer puis recréez la procédure stockée.

Afficher la procédure stockée

show create procedure <过程名称>
mysql> show create procedure queryNameById; -> // +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ | queryNameById | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `queryNameById`(In uid int(15)) begin select name from user_info where id=uid; end | utf8 | utf8_general_ci | latin1_swedish_ci | +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+ 1 row in set (0.04 sec)

Supprimer la procédure stockée

drop procedure <过程名称>

Supprimer la procédure stockée queryNameById

mysql> drop procedure  queryNameById//
Query OK, 0 rows affected (0.02 sec)


mysql> call  queryNameById(1)//
ERROR 1305 (42000): PROCEDURE rms.queryNameById does not exist

Résumé


4. 🎜>

Les fonctions personnalisées et les procédures stockées sont toutes deux des collections SQL qui remplissent des fonctions spécifiques, alors quelle est la différence entre elles ?
#自定义函数
select  <函数名>
#存储过程
call <存储过程名>
a. Différentes méthodes d'appel


b. Les fonctions personnalisées ne peuvent pas avoir de paramètres de sortie, mais les procédures stockées le peuvent.

c. Les fonctions personnalisées doivent contenir des instructions return, mais pas les procédures stockées. [Recommandations associées :

Tutoriel MySQL]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer