Mysql存儲過程

存儲過程

原文來自https://godruoyi.com/artiles/...html

存儲過程簡單來講,就是爲之後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批件,雖然它們的做用不只限於批處理。

在我看來, 存儲過程就是有業務邏輯和流程的集合, 能夠在存儲過程當中建立表,更新數據, 刪除等等。mysql

爲何要使用存儲過程sql

  1. 經過把處理封裝在容易使用的單元中,簡化複雜的操做(正如前面例子所述)。測試

  2. 因爲不要求反覆創建一系列處理步驟,這保證了數據的完整性。若是全部開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的。這一點的延伸就是防止錯誤。須要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。設計

  3. 簡化對變更的管理。若是表名、列名或業務邏輯(或別的內容)有變化,只須要更改存儲過程的代碼。使用它的人員甚至不須要知道這些變化。code

一個簡單的存儲過程htm

create procedure porcedureName ()
begin
    select name from user;
end;

存儲過程用create procedure 建立, 業務邏輯和sql寫在begin和end之間。mysql中可用call porcedureName ();來調用過程。ci

-- 調用過程
call porcedureName ();

該存儲過程沒有參數, 只是在調用的時候查詢了用戶表的用戶名而已, 調用結果以下開發

name
admin
admin1
admin2
admin3



刪除存儲過程get

DROP PROCEDURE IF EXISTS porcedureName; -- 沒有括號()

使用參數的存儲過程

create procedure procedureName(
    out min decimal(8,2),
    out avg decimal(8,2),
    out max decimal(8,2)
)
BEGIN
    select MIN(price) INTO min from order;
    select AVG(price) into avg from order;
    select MAX(price) into max from order;
END;

此過程接受三個參數, 分別用於獲取訂單表的最小、平均、最大價格。每一個參數必須具備指定的類
型,這裏使用十進制值(decimal(8,2)), 關鍵字OUT指出相應的參數用來從存儲過程傳出
一個值(返回給調用者)

MySQL支持IN(傳遞給存儲過程)、OUT(從存儲過程傳出,如這裏所用)和INOUT(對存儲過程傳入和傳出)類型的參數。存儲過程的代碼位於BEGIN和END語句內,如前所見,它們是一系列SELECT語句,用來檢索值,而後保存到相應的變量(經過指定INTO關鍵字)

爲調用此修改過的存儲過程,必須指定3個變量名,以下所示:(全部MySQL變量都必須以@開始。)

-- 因爲過程指定三個參數, 故調用必需要參數匹配
call procedureName(@min, @avg, @max);

該調用並無任何輸出, 只是把調用的結果賦給了調用時傳入的變量(@min, @avg, @max)。而後便可調用顯示該變量的值。

select @min, @avg, @max;

結果以下

@min @avg @max
42.00 601.00 2222.00



使用in參數, 輸入一個用戶id, 返回該用戶全部訂單的總價格。

create procedure getTotalById (
    in userId int,
    out total decimal(8,2)
)
BEGIN
    select SUM(r.price) from order r
    where r.u_id = userId
    into total;
END;

調用存儲過程

call getTotalById(1, @total);
select @total;

結果將返回該用戶全部訂單的合計價格。

複雜一點的過程, 根據用戶id獲取該用戶的全部訂單價格, 並動態的選擇是否加稅。代碼設計以下

create procedure getTotalByUser2(
    in userId int,
    in falg boolean, -- 是否加稅標記
    out total decimal(8,2)
)
begin
    DECLARE tmptotal DECIMAL(8,2);
    DECLARE taxrate int DEFAULT 6;-- 默認的加稅的利率
    
    select SUM(r.price) from order r
    where r.u_id = userId
    into tmptotal;
    
    if taxable then
        select tmptotal + (tmptotal/1000*taxrate) into tmptotal;
    end if;
    
    select tmptotal into total;
END;

該過程傳入三個參數, 用戶id, 是否加稅以及返回的總價格,在過程內部, 定義兩個局部變量tmptotal和taxrate,把查詢出來的結果賦給臨時變量, 在判斷是否加稅。最後把局部變量的值賦給輸出參數。

call getTotalByUser2(1, false, @total); -- 不加稅
call getTotalByUser2(1, true, @total);  -- 加稅
select @total;

參考自mysql必知必會, 轉載請註明出處。

相關文章
相關標籤/搜索