> 데이터 베이스 > MySQL 튜토리얼 > mysql 커서의 용도는 무엇입니까?

mysql 커서의 용도는 무엇입니까?

青灯夜游
풀어 주다: 2022-06-27 11:20:44
원래의
4259명이 탐색했습니다.

mysql에서 커서는 포인터 역할을 하며 주로 해당 작업을 수행하기 위해 데이터베이스를 쿼리하여 반환된 레코드 결과 집합을 탐색하는 데 사용됩니다. 커서는 실제로 여러 데이터 레코드가 포함된 결과 집합에서 한 번에 하나의 레코드를 추출하는 메커니즘입니다. 관계형 데이터베이스 관리 시스템은 본질적으로 설정 지향적입니다. MySQL에는 WHERE 절을 사용하여 하나의 레코드만 선택하도록 제한하지 않는 한 테이블의 단일 레코드를 설명하는 표현식 형식이 없습니다. 단일 레코드를 선택합니다.

mysql 커서의 용도는 무엇입니까?

이 튜토리얼의 운영 환경: 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 游标名称;

2. : 커서 이름 열기;

3. 데이터의 다음 행 가져오기: testrangeid,versionid로 커서 이름 가져오기;

4. , 삭제, 수정, 확인) ): 이는 상황에 따라 다릅니다5. 커서를 놓습니다: CLOSE 커서 이름;

참고: mysql 저장 프로시저의 각 문장은 다음으로 끝나야 합니다. , 사용된 임시 필드는 커서가 정의되기 전에 사용해야 합니다.

Example


-  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;
    로그인 후 복사
  • done 값이 true이면 루프를 종료합니다. 아래 코드를 계속 실행하세요

    Usage
  • 커서를 사용하는 방법에는 세 가지가 있습니다.

  • 첫 번째는 루프 루프를 사용하여 위의 구현입니다.

    두 번째 방법은 다음과 같이 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();
    로그인 후 복사
    위는 중첩 루프를 구현한 것입니다. 물론 이 예는 무리입니다. 한 번 보세요.

    동적 SQL

    🎜🎜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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:php.cn
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿