Mysql存儲過程

存儲過程

原文來自https://segmentfault.com/a/1190000006756268

存儲過程簡單來說,就是為以后的使用而保存的一條或多條MySQL語句的集合魄宏【槁睿可將其視為批件台盯,雖然它們的作用不僅限于批處理。

在我看來畏线, 存儲過程就是有業(yè)務(wù)邏輯和流程的集合静盅, 可以在存儲過程中創(chuàng)建表,更新數(shù)據(jù)寝殴, 刪除等等蒿叠。

為什么要使用存儲過程

  1. 通過把處理封裝在容易使用的單元中,簡化復(fù)雜的操作(正如前面例子所述)蚣常。
  2. 由于不要求反復(fù)建立一系列處理步驟市咽,這保證了數(shù)據(jù)的完整性。如果所有開發(fā)人員和應(yīng)用程序都使用同一(試驗和測試)存儲過程抵蚊,則所使用的代碼都是相同的施绎。這一點的延伸就是防止錯誤溯革。需要執(zhí)行的步驟越多,出錯的可能性就越大谷醉。防止錯誤保證了數(shù)據(jù)的一致性致稀。
  3. 簡化對變動的管理。如果表名俱尼、列名或業(yè)務(wù)邏輯(或別的內(nèi)容)有變化抖单,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化遇八。

一個簡單的存儲過程

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

存儲過程用create procedure 創(chuàng)建矛绘, 業(yè)務(wù)邏輯和sql寫在begin和end之間。mysql中可用call porcedureName ();來調(diào)用過程刃永。

-- 調(diào)用過程
call porcedureName ();

該存儲過程沒有參數(shù)货矮, 只是在調(diào)用的時候查詢了用戶表的用戶名而已, 調(diào)用結(jié)果如下

name
admin
admin1
admin2
admin3



刪除存儲過程

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

使用參數(shù)的存儲過程

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;

此過程接受三個參數(shù)揽碘, 分別用于獲取訂單表的最小次屠、平均、最大價格雳刺。每個參數(shù)必須具有指定的類
型,這里使用十進(jìn)制值(decimal(8,2))裸违, 關(guān)鍵字OUT指出相應(yīng)的參數(shù)用來從存儲過程傳出
一個值(返回給調(diào)用者)

MySQL支持IN(傳遞給存儲過程)掖桦、OUT(從存儲過程傳出,如這里所用)和INOUT(對存儲過程傳入和傳出)類型的參數(shù)供汛。存儲過程的代碼位于BEGIN和END語句內(nèi)枪汪,如前所見,它們是一系列SELECT語句怔昨,用來檢索值雀久,然后保存到相應(yīng)的變量(通過指定INTO關(guān)鍵字)

為調(diào)用此修改過的存儲過程,必須指定3個變量名趁舀,如下所示:(所有MySQL變量都必須以@開始赖捌。)

-- 由于過程指定三個參數(shù), 故調(diào)用必須要參數(shù)匹配
call procedureName(@min, @avg, @max);

該調(diào)用并沒有任何輸出矮烹, 只是把調(diào)用的結(jié)果賦給了調(diào)用時傳入的變量(@min, @avg, @max)越庇。然后即可調(diào)用顯示該變量的值。

select @min, @avg, @max;
@min @avg @max
42.00 601.00 2222.00

結(jié)果如下

@min @avg @max
42.00 601.00 2222.00



使用in參數(shù), 輸入一個用戶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;

調(diào)用存儲過程

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

結(jié)果將返回該用戶所有訂單的合計價格。

復(fù)雜一點的過程仁期, 根據(jù)用戶id獲取該用戶的所有訂單價格桑驱, 并動態(tài)的選擇是否加稅竭恬。代碼設(shè)計如下

create procedure getTotalByUser2(
    in userId int,
    in falg boolean, -- 是否加稅標(biāo)記
    out total decimal(8,2)
)
begin
    DECLARE tmptotal DECIMAL(8,2);
    DECLARE taxrate int DEFAULT 6;-- 默認(rèn)的加稅的利率
    
    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;

該過程傳入三個參數(shù), 用戶id熬的, 是否加稅以及返回的總價格痊硕,在過程內(nèi)部, 定義兩個局部變量tmptotal和taxrate悦析,把查詢出來的結(jié)果賦給臨時變量寿桨, 在判斷是否加稅。最后把局部變量的值賦給輸出參數(shù)强戴。

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

參考自mysql必知必會亭螟, 轉(zhuǎn)載請注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骑歹,一起剝皮案震驚了整個濱河市预烙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌道媚,老刑警劉巖扁掸,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異最域,居然都是意外死亡谴分,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門镀脂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牺蹄,“玉大人,你說我怎么就攤上這事薄翅∩忱迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵翘魄,是天一觀的道長鼎天。 經(jīng)常有香客問我,道長暑竟,這世上最難降的妖魔是什么斋射? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮光羞,結(jié)果婚禮上绩鸣,老公的妹妹穿的比我還像新娘。我一直安慰自己纱兑,他們只是感情好嘉裤,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布蚀之。 她就那樣靜靜地躺著,像睡著了一般遭铺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音,去河邊找鬼蒜焊。 笑死,一個胖子當(dāng)著我的面吹牛科贬,可吹牛的內(nèi)容都是我干的泳梆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼榜掌,長吁一口氣:“原來是場噩夢啊……” “哼优妙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起憎账,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤套硼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胞皱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邪意,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年反砌,在試婚紗的時候發(fā)現(xiàn)自己被綠了雾鬼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宴树,死狀恐怖呆贿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情森渐,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布冒晰,位于F島的核電站同衣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏壶运。R本人自食惡果不足惜耐齐,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒋情。 院中可真熱鬧埠况,春花似錦、人聲如沸棵癣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狈谊。三九已至喜命,卻和暖如春沟沙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壁榕。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工矛紫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牌里。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓颊咬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牡辽。 傳聞我的和親對象是個殘疾皇子喳篇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 任務(wù)需求:定時執(zhí)行的任務(wù),調(diào)用存儲過程催享,進(jìn)行數(shù)據(jù)遷移杭隙。 存儲過程相關(guān)總結(jié):(存儲過程的創(chuàng)建 不能伴隨有if exi...
    時待吾閱讀 3,060評論 0 4
  • 原文鏈接 MySQL存儲過程詳解 1.存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯,然...
    亞斯咪妮閱讀 2,670評論 1 30
  • 轉(zhuǎn)載自這里 存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯因妙,然后執(zhí)行痰憎,而存儲過程(Sto...
    杜七閱讀 2,379評論 4 27
  • 1.1 創(chuàng)建存儲過程 MySQL中,創(chuàng)建存儲過程的基本形式如下: CREATEPROCEDUREsp_name([...
    95年的哈密瓜閱讀 434評論 0 4