最近發現有張使用者資訊表中的性別欄位 由於之前的問題 沒有正確維護進資料庫中 現在需要維護下 本想直接寫個程式跑一下,想想用Mysql來實現應該會很有意思 所以決定用儲存過程來完成欄位的維護,順便複習下儲存過程的使用
什麼是儲存過程
儲存過程(Stored Procedure) 是一組為了完成特定功能的 SQL 語句集合
它主要用來完成 CURD
操作 其中可以使用流程控制語句 來完成複雜的判斷和 複雜的運算等
在經過編譯後可以儲存在資料庫中 使用者可以透過呼叫儲存過程(傳入相關引數[並不是必須]) 來呼叫它
儲存過程和函式的區別
1.函式必須要有返回值, 而儲存過程沒有這個限制
2.函式只能返回一個變數, 而儲存過程可以返回多個
3.函式的引數只有 in類的 就是輸出引數, 而儲存過程可以有 In Out Input 3種型別引數
4.函式中不能進行修改全域性資料庫狀態的操作,而儲存過程可以
5.函式可以做為查詢語句的一部分來使用,而儲存過程不可以
建立儲存過程
先上個例子
DELIMITER //
CREATE PROCEDURE proc1(int s varchar(20),out ss int,input sss double)
BEGIN
SELECT COUNT(*) INTO s FROM user;
END //
DELIMITER ;
講解:
(1)這裡需要注意的是DELIMITER//和DELIMITER;兩句,DELIMITER是分割符的意思,因為MySQL預設以”;”為分隔 符,如果我們沒有宣告分割符,那麼編譯器會把儲存過程當成SQL語句進行處理,則儲存過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當 前段分隔符,這樣MySQL才會將”;”當做儲存過程中的程式碼,不會執行這些程式碼,用完了之後要把分隔符還原。
(2)儲存過程根據需要可能會有輸入、輸出、輸入輸出引數,這裡有3個引數 第一個引數s 是輸入引數 varchar型別, 第二個引數是ss 是輸出引數 第三個引數sss 型別是輸入輸出引數, 你可以隨便定義自己需要的引數 不要按照上面的順序 上面例子引數不是必須的
儲存過程的呼叫
call procedure_name(parame1,parame2,parame3);
儲存過程完成表資訊欄位維護
回到開局問題 下面用儲存過程來完成員工表中性別欄位的維護
包含了mysql 的迴圈 條件判斷 字串函式擷取等
# 刪除儲存過程
drop procedure if exists emp_change;
delimiter //
# 建立一個儲存過程
create procedure emp_change()
begin
# 當前的記錄id
declare this_id int;
# 宣告待判斷的身份證值
declare curren_check int;
# 當前的gender
declare this_gender tinyint;
# 當前的身份證號
declare this_card_no varchar(20);
# 宣告一個是否執行完的標識
declare done int default 0;
# 把查詢結果設定到c1中 先簡單的拿2條資料測試下
declare c1 cursor for select id,card_no from employees where gender = 0;
# 宣告一個異常 如果結果集遍歷完 就把done標識設定為1 標識結束
declare continue handler for sqlstate '02000' set done = 1;
open c1;
# 開啟迴圈
repeat
# 先設定一個預設值
set this_gender = 0;
set curren_check = 0;
# 取出一條結果集
fetch c1 into this_id, this_card_no;
# 如果done標識可以繼續執行
if not done then
# 如果是15位身份證號碼
if CHAR_LENGTH(this_card_no) = 15 then
# 擷取第15位值
set curren_check = right(this_card_no, 1);
if mod(curren_check,2) = 0 then
# 整除了 就是 女
set this_gender = 2;
else
set this_gender = 1;
end if;
# 如果是18位身份證號碼
elseif CHAR_LENGTH(this_card_no) = 18 then
# 擷取第17位
set curren_check = substring(this_card_no, -2, 1);
if mod(curren_check,2) = 0 then
# 整除了 就是 女
set this_gender = 2;
else
set this_gender = 1;
end if;
end if;
# 設定好gender了 然後開始變更sql
update employees set gender = this_gender where id = this_id;
end if;
until done end repeat;
# 關閉
close c1;
end //
delimiter ;
# 執行
# call emp_change();
關於儲存過程的使用基本就這樣了
參考文件:
www.jianshu.com/p/7b2d74701ccd
www.jianshu.com/p/53a12af46836
www.cnblogs.com/chenmh/p/5201473.ht...
本作品採用《CC 協議》,轉載必須註明作者和本文連結