Un peu de compréhension des procédures stockées et des curseurs MySQL

J'ai récemment appris le langage de base de données sql, et appris les procédures stockées et les curseurs.Je ne l'ai pas du tout écouté en classe, donc on peut dire que j'étais confus tout le long. Heureusement, il existe une expérience après l'école. Cependant, le rapport d'erreur dans cmd est souvent extrêmement approximatif. Il ne vous dira que ce qui ne va pas à proximité (parfois c'est encore faux). La tâche de l'enseignant, je pense que c'est nécessaire d'écrire un enregistrement.

Tout le fond noir de l'espace cmd profond, n'entrez pas pour les faibles de cœur.

D'abord, donnez la structure du tableau que j'ai moi-même défini :

 En bref, il s'agit d'un formulaire d'informations sur les employés, où empno est le numéro d'employé, ename est le nom de l'employé, job est le nom du poste, heredate est le temps de travail, salaire est le salaire, comm est la subvention, deptno est le numéro d'unité, et mgr est le numéro d'employé du patron. Les données sont toutes aléatoires, ne les prenez pas au sérieux.

Dans ma compréhension , les procédures stockées sont en fait des fonctions qui sont souvent dites dans les langages de programmation. Les étudiants qui ont appris d'autres langages sont familiers avec les fonctions, mais le nom est vraiment grand. L'essentiel est de transmettre la valeur, puis de calculer et passer la valeur. sortir.

Une vraie question est postée directement ci-dessous :

Cette question est basée sur l'entrée empno, puis vous écrivez une procédure stockée, puis calculez le revenu annuel du nombre qu'elle contient, puis affichez la réponse. L'idée est très simple, c'est-à-dire trouver l'employé correspondant en fonction du numéro d'employé, puis trouver son salaire mensuel et sa subvention (je le prends comme une subvention mensuelle), et le multiplier par le montant pour un an pour obtenir l'annuel revenu.

Donc la question est, comment écrire cette procédure stockée ? Le mot-clé de la procédure stockée est precedence, on crée une nouvelle procédure, et puis on a dit que la procédure stockée est une fonction, il faut la donner à la personne qui doit la calculer, donc rajouter un in avant l' empno dans le liste de paramètres, indiquant qu'il s'agit d'une entrée, parce que vous devez toujours sortir la valeur, je ne sais pas s'il y a un retour dans sql, mais je peux marquer la variable dans la liste de paramètres comme out, ce qui signifie sortie, similaire à le paramètre de référence passant dans d'autres langages, comme suit ;

create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
    过程体
end

 cal_all_salary est le nom de ce processus. Il y a un in devant empno_in, ce qui signifie qu'il s'agit d'une entrée. Il y a un out devant all_salary, ce qui signifie qu'il s'agit d'une sortie. Bien sûr, ce paramètre doit être passé dans par vous-même, puis le début et la fin sont le début et la fin du processus.

Comment écrire dans le processus n'est rien de plus que de réaffecter all_salary, vous devez utiliser la méthode select...into variable from..., cette variable est ce qui doit être assigné.

select (comm+salary)*12 into all_salary from eemp where empno=empno_in;

Bien sûr, ce n'est pas complet, car il implique également les caractères de fin et de début du processus, l'exhaustivité est la suivante :

drop procedure if exists cal_all_salary;
delimiter //
create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
select (comm+salary)*12 into all_salary from eemp where empno=empno_in;
end;
//
delimiter ;

Parce qu'il est écrit dans le Bloc-notes, il n'y a pas d'indentation et le format est plus branché. La première phrase sert principalement à éviter la duplication des noms, s'il y a duplication, elle sera écrasée. La chaîne de délimitation indique que cette chaîne est utilisée comme terminateur. J'utilise // plus souvent, ce qui est défini pour éviter toute confusion avec le ; dans le corps du processus.

Testez ensuite, vous pouvez utiliser set @ nom de la variable pour définir une variable :

set @ans=0;
cal_all_salary(1,@ans);
select @ans;

 Effet:

Ainsi le stockage lui-même consiste à accomplir une tâche précise et à stocker la méthode pour accomplir cette tâche, donc la fonctionnalité est relativement claire, ce qui facilite la gestion de la base de données.

Vient ensuite le curseur . À mon avis, le curseur est une boucle, qui regroupe les qualifiés dans un ensemble, puis les extrait un par un pour le jugement et le calcul.

Le format d'utilisation du curseur est le suivant : (copié à partir d'autres)

DECLARE 迭代变量名1
.
.
.
DECLARE 游标名字 CURSOR FOR 查询语句;
open 游标名
while/repeat..
fetch 游标名 into var_name...
close 游标名

À peu près les étapes ci-dessus. Tout d'abord, je vais regrouper plusieurs attributs utiles dans le curseur, le format est {[attribut 1, attribut 2...], [attribut 1, attribut 2...]...}, chaque curseur pointe vers une ligne , avec plusieurs valeurs d'attribut, puis j'utilise la boucle pour les retirer un par un et faire ce que je veux faire. La récupération ici consiste à prendre la valeur, puis à l'affecter à la variable correspondante. La chose à surveiller est l'ouverture et la fermeture.

Une dernière question:

Le code est le suivant, il doit être implémenté correctement

 

drop procedure if exists avg_from_dept;
delimiter //
create procedure avg_from_dept(in dept_code int,out ans double)
begin
declare now_salary double;
declare no_data int default 0;
declare sum double default 0;
declare dept_cursor cursor for select salary from eemp where deptno=dept_code;
declare exit handler for not found set no_data = 1; 
open dept_cursor;
repeat
fetch dept_cursor into now_salary;
set sum=sum+now_salary;
set ans=sum/(select count(*) from eemp where deptno=dept_code);
until no_data=1
end repeat;
close dept_cursor;
end;
//
delimiter ;

set @dept_in=1;
set @ans=0;
call avg_from_dept(@dept_in,@ans);
select @ans;

Tout est dans le Bloc-notes, mal formaté...

Je suppose que tu aimes

Origine blog.csdn.net/weixin_60360239/article/details/128155051
conseillé
Classement