mysql之游標


 


本文內容:

  • 什么是游標
  • 創建游標
  • 使用游標

 

 

首發日期:2018-04-18


什么是游標:

 

  • 如果你前面看過mysql函數,會發現無法使用返回多行結果的語句。但如果你又確實想要使用時,就需要使用到游標,游標可以幫你選擇出某個結果(這樣就可以做到返回單個結果)。
  • 另外,使用游標也可以輕易的取出在檢索出來的行中前進或后退一行或多行的結果。
  • 游標可以遍歷返回的多行結果。

 

 

 

補充:

  • Mysql中游標只適用於存儲過程以及函數。

 


創建游標:

 

  • 語法:
    • 1.定義游標:declare 游標名 cursor for select語句;
    • 2.打開游標:open 游標名;
    • 獲取結果:fetch 游標名 into 變量名[,變量名];
    • 關閉游標:close 游標名;
    • create procedure p1()
      begin
          declare id int;
          declare name varchar(15);
          -- 聲明游標
          declare mc cursor for select * from class;
          -- 打開游標
          open mc;
          -- 獲取結果
          fetch mc into id,name;
          -- 這里是為了顯示獲取結果
          select id,name;
          -- 關閉游標
          close mc;
          
      end;
      create procedure p2()
      begin
          declare id int;
          declare name varchar(15);
          -- 聲明游標
          declare mc cursor for select * from class;
          -- 打開游標
          open mc;
          -- 獲取結果
          loop  -- 循環,將表的內容都轉移到class2中
          fetch mc into id,name;
          -- 這里是為了顯示獲取結果
          insert into class2 values(id,name);
          -- 關閉游標
          end loop;
          close mc;
          
      end;

 

 

 


使用游標:

 

  • 游標每一次fetch都是獲取一行結果,可以使用變量來獲取fetch到的每一列的值

 

    create procedure p2()
    begin
        declare id int;
        declare name varchar(15);
        -- 聲明游標
        declare mc cursor for select * from class;
        -- 打開游標
        open mc;
        -- 獲取結果
        loop  -- 循環,將表的內容都轉移到class2中
        fetch mc into id,name;
        -- 這里是為了顯示獲取結果
        insert into class2 values(id,name);
        -- 關閉游標
        end loop;
        close mc;
        
    end;

上面的代碼會有一個報錯image,不斷循環的話,始終會達到表的末尾,到了末尾就無法繼續fetch,一般來說都要避免報錯,到了末尾前會有一個mysql定義的

create procedure p3()
begin
    declare id int;
    declare name varchar(15);
    declare flag int default 0;
    -- 聲明游標
    declare mc cursor for select * from class;
    declare continue handler for not found set flag = 1;
    -- 打開游標
    open mc;
    -- 獲取結果
    l2:loop 
    
    fetch mc into id,name;
    if flag=1 then -- 當無法fetch會觸發handler continue
        leave l2;
    end if;
    -- 這里是為了顯示獲取結果
    insert into class2 values(id,name);
    -- 關閉游標
    end loop;
    close mc;
    
end;

call p3();-- 不報錯
select * from class2;

 

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM