Maison > Article > base de données > [MySQL 10] Curseur
Dans la base de données, il existe deux manières de traiter les données :
L'une est la méthode de traitement globale basée sur la collecte de lignes de données, en utilisant directement les instructions select, update, delete et autres pour opérer (l'instruction select interroge directement une colonne entière );
La première consiste à traiter les lignes de données ligne par ligne. Le curseur est ce mécanisme d'accès aux données, permettant aux utilisateurs d'accéder à une seule ligne de données à la fois au lieu de l'ensemble des lignes de données (le curseur effectue une opération). requête ligne par ligne dans une certaine colonne).
1. Créez une table de données
mysql> select * from person; +----+------+------+------+-----------+| id | name | sex | age | addr | +----+------+------+------+-----------+| 1 | Jone | fema | 27 | xianggang | | 2 | Lily | fema | 25 | taiwan | | 3 | Bobe | male | 25 | ximan || 4 | Kity | fama | 20 | beijing | +----+------+------+------+-----------+
Interrogez la colonne addr dans la table de données de personne afin que les résultats soient affichés sous cette forme :
xianggang ;taiwan;ximan;beijing;
2. Requête
Méthode 1 :
drop procedure if exists useCursor ;delimiter //CREATE PROCEDURE useCursor() # 创建一个存储过程 BEGIN DECLARE oneAddr varchar(20) default ''; # 定义一个变量oneAddr DECLARE allAddr varchar(80) default ''; # 定义一个变量allAddr DECLARE curl CURSOR FOR SELECT addr FROM person.person; # 定义一个游标curl DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null; # 如果没有数据返回,就将变量oneAddr设置为null # 也可以这么写 # DECLARE CONTINUE HANDLER FOR NOT FOUND SET oneAddr = null; OPEN curl; # 打开游标 FETCH curl INTO oneAddr; # 通过游标读取数据 WHILE(oneAddr is not null) DO # 使用 while...do 循环来遍历 addr 列 set oneAddr = CONCAT(oneAddr, ';'); set allAddr = CONCAT(allAddr, oneAddr); FETCH curl into oneAddr; END WHILE; CLOSE curl; # 关闭游标 SELECT allAddr; END;//call useCursor();
Méthode 2 :
drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor() BEGIN DECLARE oneAddr varchar(20) default ''; DECLARE allAddr varchar(80) default ''; DECLARE done INT DEFAULT 0; # 定义一个默认值0 DECLARE curl CURSOR FOR SELECT addr FROM person.person; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN curl; REPEAT # 使用repeat循环来遍历addr列 FETCH curl INTO oneAddr; IF NOT done THEN set oneAddr = CONCAT(oneAddr, ';'); set allAddr = CONCAT(allAddr, oneAddr); END IF; UNTIL done END REPEAT; #直到为0才结束循环 CLOSE curl; select allAddr; END;//call useCursor();
Méthode 3 :
drop procedure if exists useCursor;delimiter //CREATE PROCEDURE useCursor() BEGIN DECLARE oneAddr varchar(20) default ''; DECLARE allAddr varchar(80) default ''; DECLARE done bool DEFAULT false; # 定义布尔变量,默认值为false DECLARE curl CURSOR FOR SELECT addr FROM person.person; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; OPEN curl; personLoop: LOOP #使用loop循环来遍历addr列 FETCH curl INTO oneAddr; IF done THEN LEAVE personLoop; ELSE set oneAddr = CONCAT(oneAddr, ';'); set allAddr = CONCAT(allAddr, oneAddr); END IF; END LOOP personLoop; CLOSE curl; select allAddr; END;//call useCursor();
3. Résultats de sortie
mysql> call useCursor();// +---------------------------------+| allAddr | +---------------------------------+| xianggang;taiwan;ximan;beijing; | +---------------------------------+
Ce qui précède est le contenu du curseur [MySQL 10]. veuillez faire attention au site Web PHP chinois (www.php.cn) !