집 >데이터 베이스 >MySQL 튜토리얼 >[MySQL 10] 커서
데이터베이스에서 데이터를 처리하는 방법에는 두 가지가 있습니다.
하나는 데이터 행의 집합을 기반으로 하는 전체 처리 방법으로, 직접 select, update, delete 등의 문을 사용하여 조작합니다(select 문은 직접 쿼리를 수행합니다).
하나는 데이터 행을 행 단위로 처리하는 것입니다. 커서는 사용자가 전체 데이터 행 집합 대신 한 번에 단일 데이터 행에 액세스할 수 있도록 하는 데이터 액세스 메커니즘입니다. 특정 열의 행별 쿼리).
1. 데이터 테이블을 생성합니다
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 | +----+------+------+------+-----------+
개인 데이터 테이블의 addr 열을 쿼리하여 결과가 다음 형식으로 출력되도록 합니다.
xianggang;taiwan ;ximan;beijing;
2. 쿼리
방법 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();
방법 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();
방법 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. 출력 결과
mysql> call useCursor();// +---------------------------------+| allAddr | +---------------------------------+| xianggang;taiwan;ximan;beijing; | +---------------------------------+
위는 [MySQL 10] 커서의 내용이며, 자세한 내용은 PHP 중국어 홈페이지(www)를 참고하시기 바랍니다. .php.cn)!