mysql에서 커서는 포인터 역할을 하며 주로 해당 작업을 수행하기 위해 데이터베이스를 쿼리하여 반환된 레코드 결과 집합을 탐색하는 데 사용됩니다. 커서는 실제로 여러 데이터 레코드가 포함된 결과 집합에서 한 번에 하나의 레코드를 추출하는 메커니즘입니다. 관계형 데이터베이스 관리 시스템은 본질적으로 설정 지향적입니다. MySQL에는 WHERE 절을 사용하여 하나의 레코드만 선택하도록 제한하지 않는 한 테이블의 단일 레코드를 설명하는 표현식 형식이 없습니다. 단일 레코드를 선택합니다.
이 튜토리얼의 운영 환경: windows7 시스템, mysql8 버전, Dell G3 컴퓨터.
MySQL 커서(Cursor)
커서는 실제로 여러 데이터 레코드가 포함된 결과 집합에서 한 번에 하나의 레코드를 추출할 수 있는 메커니즘입니다.
커서는 포인터 역할을 합니다.
커서는 결과의 모든 행을 탐색할 수 있지만 한 번에 한 행만 가리킵니다.
커서의 기능은 해당 작업을 수행하기 위해 데이터베이스를 쿼리하여 반환된 레코드를 탐색하는 것입니다.
관계형 데이터베이스 관리 시스템은 본질적으로 집합 지향적입니다. MySQL에서는 WHERE 절을 사용하여 하나의 레코드만 선택하도록 제한하지 않는 한 테이블의 단일 레코드를 설명하는 표현식 형식이 없습니다. 따라서 때로는 단일 레코드의 데이터를 처리하기 위해 커서를 사용해야 하는 경우도 있습니다.
일반적으로 커서는 데이터를 수정하기 위해 결과 집합의 특정 행을 찾는 데 사용됩니다.
커서 사용
1. 커서 선언: 테이블에 대한 커서 이름 CURSOR 선언
(여기의 테이블은 쿼리하는 모든 컬렉션일 수 있음)declare 游标名称 CURSOR for table;
(这里的table可以是你查询出来的任意集合)
2、打开定义的游标:open 游标名称;
3、获得下一行数据:FETCH 游标名称 into testrangeid,versionid;
4、需要执行的语句(增删改查):这里视具体情况而定
5、释放游标:CLOSE 游标名称;
커서 이름 열기;
3. 데이터의 다음 행 가져오기: testrangeid,versionid로 커서 이름 가져오기;
4. , 삭제, 수정, 확인) ): 이는 상황에 따라 다릅니다5. 커서를 놓습니다: CLOSE 커서 이름;
- BEGIN --定义变量 declare testrangeid BIGINT; declare versionid BIGINT; declare done int; --创建游标,并存储数据 declare cur_test CURSOR for select id as testrangeid,version_id as versionid from tp_testrange; --游标中的内容执行完后将done设置为1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; --打开游标 open cur_test; --执行循环 posLoop:LOOP --判断是否结束循环 IF done=1 THEN LEAVE posLoop; END IF; --取游标中的值 FETCH cur_test into testrangeid,versionid; --执行更新操作 update tp_data_execute set version_id=versionid where testrange_id = testrangeid; END LOOP posLoop; --释放游标 CLOSE cur_test; END -
예제 2:
이제 저장 프로시저를 사용하여 iPhone의 총 재고를 계산하고 총계를 콘솔에 출력하는 함수를 만들어 보겠습니다.
--在windows系统中写存储过程时,如果需要使用declare声明变量,需要添加这个关键字,否则会报错。 delimiter // drop procedure if exists StatisticStore; CREATE PROCEDURE StatisticStore() BEGIN --创建接收游标数据的变量 declare c int; declare n varchar(20); --创建总数变量 declare total int default 0; --创建结束标志变量 declare done int default false; --创建游标 declare cur cursor for select name,count from store where name = 'iphone'; --指定游标循环结束时的返回值 declare continue HANDLER for not found set done = true; --设置初始值 set total = 0; --打开游标 open cur; --开始循环游标里的数据 read_loop:loop --根据游标当前指向的一条数据 fetch cur into n,c; --判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if; --获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作, set total = total + c; --结束游标循环 end loop; --关闭游标 close cur; --输出结果 select total; END; --调用存储过程 call StatisticStore();
fetch는 현재 커서가 가리키는 데이터 행을 가져와서 포인터가 다음 행을 가리키도록 하는 것입니다. 커서가 이미 마지막 행을 가리키고 있을 때 계속 실행하면 커서가 오버플로됩니다.
루프 커서를 사용하면 마지막 데이터 조각에 도달했는지 여부를 모니터링하지 않습니다. 다음과 같은 코드를 작성하면 무한 루프가 발생합니다.read_loop:loop fetch cur into n,c; set total = total+c; end loop;MySql에서는 커서가 오버플로되면 미리 정의된 mysql이 실행됩니다. NOT FOUND 오류이므로 위에서 다음 코드를 사용하여 찾을 수 없음 오류가 발생할 때 계속 이벤트를 지정하고 이 이벤트가 발생할 때 done 변수의 값을 수정합니다.
declare continue HANDLER for not found set done = true;따라서 다음 코드가 루프에 추가됩니다.
--判断游标的循环是否结束 if done then leave read_loop; --跳出游标循环 end if;
두 번째 방법은 다음과 같이 while 루프를 사용합니다. :
drop procedure if exists StatisticStore1; CREATE PROCEDURE StatisticStore1() BEGIN declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; fetch cur into n,c; while(not done) do set total = total + c; fetch cur into n,c; end while; close cur; select total; END; call StatisticStore1();세 번째 방법은 반복 실행을 사용하는 것입니다.
drop procedure if exists StatisticStore2; CREATE PROCEDURE StatisticStore2() BEGIN declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; repeat fetch cur into n,c; if not done then set total = total + c; end if; until done end repeat; close cur; select total; END; call StatisticStore2();
Cursornesting
mysql에서 각 시작 끝 블록은 독립적인 범위 영역입니다. 왜냐하면 MySql의 동일한 오류 이벤트는 한 번만 정의할 수 있기 때문입니다. 정의가 여러 개인 경우 컴파일 중에 동일한 블록에 선언된 Duplicate 핸들러를 묻는 메시지가 표시됩니다.drop procedure if exists StatisticStore3; CREATE PROCEDURE StatisticStore3() BEGIN declare _n varchar(20); declare done int default false; declare cur cursor for select name from store group by name; declare continue HANDLER for not found set done = true; open cur; read_loop:loop fetch cur into _n; if done then leave read_loop; end if; begin declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'iphone'; declare continue HANDLER for not found set done = true; set total = 0; open cur; iphone_loop:loop fetch cur into n,c; if done then leave iphone_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin declare c int; declare n varchar(20); declare total int default 0; declare done int default false; declare cur cursor for select name,count from store where name = 'android'; declare continue HANDLER for not found set done = true; set total = 0; open cur; android_loop:loop fetch cur into n,c; if done then leave android_loop; end if; set total = total + c; end loop; close cur; select _n,n,total; end; begin end; end loop; close cur; END; call StatisticStore3();위는 중첩 루프를 구현한 것입니다. 물론 이 예는 무리입니다. 한 번 보세요. 🎜🎜Mysql은 동적 SQL 기능을 지원합니다🎜
set @sqlStr='select * from table where condition1 = ?'; prepare s1 for @sqlStr; --如果有多个参数用逗号分隔 execute s1 using @condition1; --手工释放,或者是 connection 关闭时, server 自动回收 deallocate prepare s1;🎜[관련 권장 사항: 🎜mysql 비디오 튜토리얼🎜]🎜
위 내용은 mysql 커서의 용도는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!