1. 程式人生 > >MySql 使用儲存過程和遊標讀取並更新資料

MySql 使用儲存過程和遊標讀取並更新資料

1、遊標的作用及屬性

遊標的作用就是用於對查詢資料庫所返回的記錄進行遍歷,以便進行相應的操作;遊標有下面這些屬性:

    a、遊標是隻讀的,也就是不能更新它;

    b、遊標是不能滾動的,也就是隻能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄;

    c、避免在已經開啟遊標的表上更新資料。

2、如何使用遊標

使用遊標需要遵循下面步驟:

     a、首先用DECLARE語句宣告一個遊標              

  1. DECLARE cursor_name CURSORFOR SELECT_statement;  
上面這條語句就對,我們執行的select語句返回的記錄指定了一個遊標   

     b、其次需要使用OPEN語句來開啟上面你定義的遊標

  1. OPEN cursor_name;  
     c、接下來你可以用FETCH語句來獲得下一行資料,並且遊標也將移動到對應的記錄上(這個就類似java裡面的那個iterator)。
  1. FETCH cursor_name INTO variable list;  
     d、然後最後當我們所需要進行的操作都結束後我們要把遊標釋放掉。
  1. CLOSE cursor_name;  
在使用遊標時需要注意的是,使用定義一個針對NOT FOUND的條件處理函式(condition handler)來避免出現“no data to fetch”這樣的錯誤,條件處理函式就是當某種條件產生時所執行的程式碼,這裡但我們遊標指到記錄的末尾時,便達到NOT FOUND這樣條件,這個時候我們希望繼續進行後面的操作,所以我們會在下面的程式碼中看到一個CONTINUE。先看看我們的表格內容:

下面的遊標使用演示獲取庫存量小於100的產品的程式碼code,這個程式碼純粹演示如何使用,在這裡沒有其他任何意義:)

  1. DELIMITER $$  
  2. DROPPROCEDURE IF EXISTS `test`.`CursorProc` $$  
  3. CREATEPROCEDURE `test`.`CursorProc` ()  
  4. BEGIN
  5.  DECLARE  no_more_products, quantity_in_stock INTDEFAULT 0;  
  6.  DECLARE  prd_code VARCHAR(255);  
  7.  DECLARE  cur_product CURSOR
    FORSELECT code FROM products;  /*First: Delcare a cursor,首先這裡對遊標進行定義*/  
  8.  DECLARECONTINUE HANDLER FORNOT FOUND  SET  no_more_products = 1; /*when"not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/  
  9.  /* for  loggging information 建立個臨時表格來保持*/  
  10.  CREATETEMPORARYTABLE infologs (  
  11.  Id int(11) NOTNULL AUTO_INCREMENT,  
  12.  Msg varchar(255) NOTNULL,  
  13.  PRIMARYKEY (Id)  
  14.  );  
  15.  OPEN  cur_product; /*SecondOpen the cursor 接著使用OPEN開啟遊標*/  
  16.  FETCH  cur_product INTO prd_code; /*Third: now you can Fetch the row 把第一行資料寫入變數中,遊標也隨之指向了記錄的第一行*/  
  17.  REPEAT  
  18.  SELECT  quantity INTO quantity_in_stock  
  19.  FROM  products  
  20.  WHERE  code = prd_code;  
  21.  IF  quantity_in_stock < 100 THEN
  22.  INSERTINTO infologs(msg)  
  23.  VALUES  (prd_code);  
  24.  END  IF;  
  25.  FETCH  cur_product INTO prd_code;  
  26.  UNTIL  no_more_products = 1  
  27.  END REPEAT;  
  28.  CLOSE  cur_product;  /*Finally: cursor need be closed 用完後記得用CLOSE把資源釋放掉*/  
  29.  SELECT *  FROM infologs;  
  30.  DROPTABLE  infologs;  
  31. END $$  
  32. DELIMITER ;