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中的資料被更新了.