In the database, data processing is divided into two ways:
One is the overall processing method based on the data row collection, directly using select, update, delete and other statements to operate (the select statement directly queries an entire column );
One is to process data rows row by row. The cursor is this data access mechanism, allowing users to access a single data row at a time instead of the entire set of data rows (the cursor performs a row-by-row query in a certain column).
1. Create a data table
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 | +----+------+------+------+-----------+
Query the addr column in the person data table so that the results are output in this form:
xianggang;taiwan ;ximan;beijing;
2. Query
Method 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();
Method 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();
Method 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. Output result
mysql> call useCursor();// +---------------------------------+| allAddr | +---------------------------------+| xianggang;taiwan;ximan;beijing; | +---------------------------------+
The above is the content of [MySQL 10] cursor. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!