Mysql 儲存過程的使用

reggie發表於2021-08-05

最近發現有張使用者資訊表中的性別欄位 由於之前的問題 沒有正確維護進資料庫中 現在需要維護下 本想直接寫個程式跑一下,想想用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 協議》,轉載必須註明作者和本文連結
微信公眾號:碼咚沒 ( ID: codingdongmei )

相關文章