1. 程式人生 > >MySql中一個簡單的儲存過程刷資料庫資料

MySql中一個簡單的儲存過程刷資料庫資料

今天有朋友問我用orcale儲存過程刷資料庫資料怎麼寫的,他的要求是兩張表,一張表裡面欄位為空的話,就從另外一張表中取資料更新這個表.orcale中寫完之後,突然想到在mysql中怎麼寫呢,於是在網上找了一下資料.特意在此記錄一下寫法.(orcale的待會也補上!!!)

因為原來mysql中就有兩張表,就懶得建表了.修改兩張表的資料如下:




現在如果email表中的content為空的話,就用student表中的fenshu更新資料,程式碼如下:

create procedure my_procedure() -- 建立儲存過程  
begin -- 開始儲存過程  
declare my_id int; -- 自定義變數1  
declare my_content varchar(50); -- 自定義變數2  
DECLARE done INT DEFAULT FALSE; -- 自定義控制遊標迴圈變數,預設false 
  
DECLARE My_Cursor CURSOR FOR (select id,content from email where content is null or content = ''); -- 定義遊標並輸入結果集 結果集越少越好
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 繫結控制變數到遊標,遊標迴圈結束自動轉true  
  
OPEN My_Cursor; -- 開啟遊標  
  myLoop: LOOP -- 開始迴圈體,myLoop為自定義迴圈名,結束迴圈時用到  
    FETCH My_Cursor into my_id, my_content; -- 將遊標當前讀取行的資料順序賦予自定義變數12  
    IF done THEN -- 判斷是否繼續迴圈  
      LEAVE myLoop; -- 結束迴圈  
    END IF;  
    -- 自己要做的事情,在 sql 中直接使用自定義變數即可  
    -- if(my_content is null or my_content = '') then 這樣寫的迴圈次數太多了
      update email set content = (select fenshu from student where id = my_id) where id = my_id;
      COMMIT; -- 提交事務
   -- end if;  
  END LOOP myLoop; -- 結束自定義迴圈體  
  CLOSE My_Cursor; -- 關閉遊標  
END; -- 結束儲存過程  


-- sql 執行儲存過程  
 call my_procedure();   

-- select * from email 

-- sql 刪除儲存過程  
drop procedure my_procedure; 

編譯過後執行儲存過程,結果如圖:


可以清楚的發現email中的資料被更新了.