1. 程式人生 > 資料庫 >mysql遊標的原理與用法例項分析

mysql遊標的原理與用法例項分析

本文例項講述了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);
      -- 關閉遊標
      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;

更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》

希望本文所述對大家MySQL資料庫計有所幫助。