Explication détaillée des procédures stockées/déclencheurs MySQL-SQL (Partie 2)

♥️Auteur : Xiao Liu à Station C

♥️Page d'accueil personnelle :  la page d'accueil de Xiao Liu 

♥️Les efforts ne sont pas forcément payants, mais il y aura des gains ! Travailler dur ensemble pour une vie meilleure !

♥️ Découvrez l'expérience d'exploitation et de maintenance résumée en deux ans et un ensemble complet de didacticiels d'expérimentation de réseau pour les simulateurs Cisco. Chronique : Technologie de l'informatique en nuage

♥️Xiao Liu message privé peut demander avec désinvolture, tant que vous le savez, vous ne serez pas avare, merci CSDN de nous avoir permis de nous rencontrer !

avant-propos

Le chapitre précédent parlait en détail des procédures stockées/déclencheurs MySQL-SQL (Partie 1) et ce chapitre continue

Table des matières

1.4 si

1. Introduction

2) Cas

1.4.1 Paramètres

1. Introduction

 usage:

2) Cas 1

3) Cas 2

1.4.2 cas

1. Introduction

Grammaire 2 :

2) Cas

1.4.3pendant que

1. Introduction

2) Cas

1.4.4répéter

1. Introduction

2) Cas

1.4.5 boucle

1. Introduction

2) Cas 1

3) Cas 2

1.4.6

1. Introduction

A. Déclarer un curseur

B. Ouvrir le curseur

C. Obtenir les enregistrements du curseur

D. Fermez le curseur

2) Cas

1.4.7 Gestionnaires de conditions

1. Introduction

2) Cas


1.4 si

1) .Présentation

si est utilisé pour le jugement conditionnel, la structure grammaticale spécifique est :
IF 条件1 THEN
.....
ELSEIF 条件2 THEN -- 可选
.....
ELSE -- 可选
.....
END IF;
Dans la structure du jugement conditionnel if , il peut y avoir plusieurs structures ELSE IF ou aucune. La structure ELSE peut ou non être présente.

2) Cas

Selon la variable de score définie , déterminez le niveau de score correspondant au score actuel.
note >= 85 points, la note est excellente.
score >= 60 points et score < 85 points, la note est réussite.
score < 60 points, la note est un échec.
create procedure p3()
begin
declare score int default 58;
declare result varchar(10);
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
select result;
end;
call p3(); 
Bien que nous ayons satisfait aux exigences ci-dessus, certains problèmes subsistent, tels que : le score est défini dans le processus de stockage et le niveau de score final calculé n'est affiché que dans la requête finale.
Pouvons-nous donc transmettre le score score de manière dynamique et le niveau de score calculé peut-il être renvoyé sous forme de valeur de retour ? La réponse est oui, nous pouvons résoudre les problèmes ci-dessus grâce aux paramètres expliqués ci-dessous. ,

1.4.1 Paramètres _

1) .Présentation

Les types de paramètres sont principalement divisés en trois types suivants : IN , OUT , INOUT . La signification spécifique est la suivante :

 usage:

CREATE PROCEDURE 存储过程名称 ([ IN/OUT/INOUT 参数名 参数类型 ])
BEGIN
-- SQL语句
END ;

2) Cas 1

Selon le paramètre entrant score , déterminez le niveau de score correspondant au score actuel et renvoyez-le.
note >= 85 points, la note est excellente.
score >= 60 points et score < 85 points, la note est réussite.
score < 60 points, la note est un échec.
create procedure p4(in score int, out result varchar(10))
begin
if score >= 85 then
set result := '优秀';
elseif score >= 60 then
set result := '及格';
else
set result := '不及格';
end if;
end;
-- 定义用户变量 @result来接收返回的数据, 用户变量可以不用声明
call p4(18, @result);
select @result;

3) Cas 2

将传入的200分制的分数,进行换算,换算成百分制,然后返回。
create procedure p5(inout score double)
begin
set score := score * 0.5;
end;
set @score = 198;
call p5(@score);
select @score;

1.4.2 cas

1) .Présentation

La structure et la fonction du boîtier sont très similaires aux fonctions de contrôle de processus que nous avons expliquées dans le chapitre de base. Il existe deux formats de syntaxe :
Syntaxe 1 :
-- 含义: 当case_value的值为 when_value1时,执行statement_list1,当值为 when_value2时,
执行statement_list2, 否则就执行 statement_list
CASE case_value
WHEN when_value1 THEN statement_list1
[ WHEN when_value2 THEN statement_list2] ...
[ ELSE statement_list ]
END CASE;

Syntaxe 2 :

-- 含义: 当条件search_condition1成立时,执行statement_list1,当条件search_condition2成
立时,执行statement_list2, 否则就执行 statement_list
CASE
WHEN search_condition1 THEN statement_list1
[WHEN search_condition2 THEN statement_list2] ...
[ELSE statement_list]
END CASE;

2) Cas

Selon le mois entrant, déterminez la saison à laquelle appartient le mois ( la structure de cas est requise).
Janvier-mars est le premier trimestre
Avril-juin est le deuxième trimestre
Juillet-septembre est le troisième trimestre
Octobre-décembre est le quatrième trimestre
create procedure p6(in month int)
begin
declare result varchar(10);
case
when month >= 1 and month <= 3 then
set result := '第一季度';
when month >= 4 and month <= 6 then
set result := '第二季度';
when month >= 7 and month <= 9 then
set result := '第三季度'; 
when month >= 10 and month <= 12 then
set result := '第四季度';
else
set result := '非法参数';
end case ;
select concat('您输入的月份为: ',month, ', 所属的季度为: ',result);
end;
call p6(16);
S'il existe plusieurs conditions de jugement, et ou ou peut être utilisé pour connecter plusieurs conditions.

1.4.3 tandis que

1) .Présentation

La boucle while est une instruction de contrôle de boucle conditionnelle. Une fois la condition remplie, exécutez l'instruction SQL dans le corps de la boucle. La syntaxe spécifique est :
-- 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DO
SQL逻辑...
END WHILE;

2) Cas

Calculez la valeur cumulée de 1 à n , où n est la valeur du paramètre transmis.
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行减1 , 如果n减到0, 则退出循环
create procedure p7(in n int)
begin
declare total int default 0;
while n>0 do
set total := total + n;
set n := n - 1;
end while;
select total;
end;
call p7(100);

1.4.4 répéter

1) .Présentation

Repeat est une instruction de contrôle de boucle conditionnelle . Lorsque la condition de l'instruction until est remplie , la boucle est fermée. La syntaxe spécifique est :
-- 先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环
REPEAT
SQL逻辑...
UNTIL 条件
END REPEAT;

2) Cas

Calculez la valeur cumulée de 1 à n , où n est la valeur du paramètre transmis. ( implémenté en utilisant repeat )
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环
create procedure p8(in n int)
begin
declare total int default 0;
repeat
set total := total + n;
set n := n - 1;
until n <= 0
end repeat;
select total;
end;
call p8(10);
call p8(100);

1.4.5 boucle

1) .Présentation

LOOP implémente une boucle simple. Si vous n'ajoutez pas de conditions pour quitter la boucle dans la logique SQL , vous pouvez l'utiliser pour implémenter une boucle infinie simple. OOP peut être utilisé avec les deux instructions suivantes : LEAVE : utilisé avec une boucle pour sortir de la boucle.
ITERATE : Il doit être utilisé dans une boucle, et sa fonction est de sauter les instructions restantes de la boucle en cours et d'entrer directement dans la boucle suivante.

[begin_label:] LOOP
SQL逻辑...
END LOOP [end_label]; 
LEAVE label; -- 退出指定标记的循环体
ITERATE label; -- 直接进入下一次循环
Les étiquettes begin_label , end_label et label qui apparaissent dans la syntaxe ci-dessus font référence à nos balises personnalisées.

2) Cas 1

Calculez la valeur cumulée de 1 à n , où n est la valeur du paramètre transmis.
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xx
create procedure p9(in n int)
begin

declare total int default 0;

sum:loop

if n<=0 then
leave sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;
select total;
end;
call p9(100);

3) Cas 2

Calculez la valeur cumulée des nombres pairs de 1 à n , où n est la valeur du paramètre transmis.
-- A. 定义局部变量, 记录累加之后的值;
-- B. 每循环一次, 就会对n进行-1 , 如果n减到0, 则退出循环 ----> leave xx
-- C. 如果当次累加的数据是奇数, 则直接进入下一次循环. --------> iterate xx
create procedure p10(in n int)
begin
declare total int default 0;
sum:loop
if n<=0 then
leave sum;
end if;
if n%2 = 1 then
set n := n - 1;
iterate sum;
end if;
set total := total + n;
set n := n - 1;
end loop sum;
select total;
end;
call p10(100);

1.4.6

1) .Présentation

Le curseur ( CURSOR ) est un type de données utilisé pour stocker les ensembles de résultats de requête . Dans les procédures et fonctions stockées, les curseurs peuvent être utilisés pour parcourir les ensembles de résultats. L'utilisation du curseur inclut la déclaration du curseur, OPEN , FETCH et CLOSE , et sa syntaxe est la suivante.
X

A. Déclarer un curseur

DECLARE 游标名称 CURSOR FOR 查询语句 ;

B. Ouvrir le curseur

OPEN 游标名称 ;

C. Obtenir les enregistrements du curseur

FETCH 游标名称 INTO 变量 [, 变量 ] ;

D. Fermez le curseur

CLOSE 游标名称 ;

2) Cas

Selon le paramètre entrant uage , pour interroger la table utilisateur tb_user , l'âge de tous les utilisateurs est inférieur ou égal au nom d'utilisateur de uage
( nom ) et profession ( profession ), et insérez le nom et la profession de l'utilisateur dans une nouvelle table créée
dans (id,nom,profession) .
-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游标
create procedure p11(in uage int)
begin
declare uname varchar(100);
declare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <=
uage;
drop table if exists tb_user_pro;
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
open u_cursor;
while true do
fetch u_cursor into uname,upro;
insert into tb_user_pro values (null, uname, upro);
end while;
close u_cursor;
end;
call p11(30);
La procédure stockée ci-dessus, à la fin, nous signalerons une erreur lors du processus d'appel. La raison de l'erreur est qu'il n'y a pas de condition de sortie dans la boucle while ci-dessus. Une fois l'ensemble de données du curseur obtenu, si les données sont obtenues à nouveau, une erreur sera signalée, mettant ainsi fin à l'exécution du programme.

 

Mais à ce moment, la structure de la table tb_user_pro et ses données ont été insérées avec succès, nous pouvons directement actualiser la structure de la table et vérifier les données dans la structure de la table.

 

Bien que nous ayons implémenté les fonctions ci-dessus, la logique n'est pas parfaite et une fois le programme exécuté, aucune donnée ne peut être obtenue et la base de données signale toujours une erreur. Ensuite, nous devons terminer la procédure stockée et résoudre ce problème.
Pour résoudre ce problème, vous devez le résoudre via le gestionnaire de conditions Handler fourni dans MySQL .

1.4.7 Gestionnaires de conditions

1) .Présentation

Le gestionnaire de conditions ( Handler ) peut être utilisé pour définir les étapes de traitement correspondantes lorsque des problèmes sont rencontrés lors de l'exécution de la structure de contrôle de flux. La syntaxe spécifique est :
DECLARE handler_action HANDLER FOR condition_value [, condition_value]
... statement ;
handler_action 的取值:
CONTINUE: 继续执行当前程序
EXIT: 终止执行当前程序
condition_value 的取值:
SQLSTATE sqlstate_value: 状态码,如 02000
SQLWARNING: 所有以01开头的SQLSTATE代码的简写
NOT FOUND: 所有以02开头的SQLSTATE代码的简写
SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写

2) Cas

Continuons à remplir les exigences soulevées dans la section précédente et résolvons les problèmes.
Selon le paramètre entrant uage , pour interroger la table utilisateur tb_user , l'âge de tous les utilisateurs est inférieur ou égal au nom d'utilisateur de uage
( nom ) et profession ( profession ), et insérez le nom et la profession de l'utilisateur dans une nouvelle table créée
dans (id,nom,profession) .
A. Spécifier un code d'état spécifique via SQLSTATE
-- 逻辑:
-- A. 声明游标, 存储查询结果集
-- B. 准备: 创建表结构
-- C. 开启游标
-- D. 获取游标中的记录
-- E. 插入数据到新表中
-- F. 关闭游标
create procedure p11(in uage int)
begin
declare uname varchar(100);
declare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <=
uage;
-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02000时,将关闭游标u_cursor,并退出
declare exit handler for SQLSTATE '02000' close u_cursor;
drop table if exists tb_user_pro;
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
open u_cursor;
while true do
fetch u_cursor into uname,upro;
insert into tb_user_pro values (null, uname, upro);
end while;
close u_cursor;
end;
call p11(30);
B. La méthode d'abréviation de code NOT FOUND via SQLSTATE
Le code d'état commençant par 02 , le code est abrégé en NOT FOUND
create procedure p12(in uage int)
begin
declare uname varchar(100);
declare upro varchar(100);
declare u_cursor cursor for select name,profession from tb_user where age <=
uage;
-- 声明条件处理程序 : 当SQL语句执行抛出的状态码为02开头时,将关闭游标u_cursor,并退出
declare exit handler for not found close u_cursor;
drop table if exists tb_user_pro;
create table if not exists tb_user_pro(
id int primary key auto_increment,
name varchar(100),
profession varchar(100)
);
open u_cursor;
while true do
fetch u_cursor into uname,upro;
insert into tb_user_pro values (null, uname, upro);
end while;
close u_cursor;
end;
call p12(30);

♥️Suivant est le moteur de ma création

♥️Like, est la plus grande reconnaissance pour moi

♥️C'est Xiaoliu, je suis inspirant de bien faire chaque article, merci à tous

Je suppose que tu aimes

Origine blog.csdn.net/lzl10211345/article/details/131353327
conseillé
Classement