日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mySql存储过程,简单实现实例

發(fā)布時(shí)間:2024/4/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mySql存储过程,简单实现实例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文來自

https://godruoyi.com/artiles/...


這個(gè)可以作為mySql的存儲(chǔ)過程的入門資料。


存儲(chǔ)過程簡(jiǎn)單來說,就是為以后的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限于批處理。

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


為什么要使用存儲(chǔ)過程


通過把處理封裝在容易使用的單元中,簡(jiǎn)化復(fù)雜的操作(正如前面例子所述)。

由于不要求反復(fù)建立一系列處理步驟,這保證了數(shù)據(jù)的完整性。如果所有開發(fā)人員和應(yīng)用程序都使用同一(試驗(yàn)和測(cè)試)存儲(chǔ)過程,則所使用的代碼都是相同的。這一點(diǎn)的延伸就是防止錯(cuò)誤。需要執(zhí)行的步驟越多,出錯(cuò)的可能性就越大。防止錯(cuò)誤保證了數(shù)據(jù)的一致性。

簡(jiǎn)化對(duì)變動(dòng)的管理。如果表名、列名或業(yè)務(wù)邏輯(或別的內(nèi)容)有變化,只需要更改存儲(chǔ)過程的代碼。使用它的人員甚至不需要知道這些變化。

一個(gè)簡(jiǎn)單的存儲(chǔ)過程

(無參數(shù)。可以不指定參數(shù)。)

create procedure porcedureName ()

begin

? ? select name from user;

end;


①也可以用Navicate直接創(chuàng)建存儲(chǔ)過程:

②參數(shù)屬性

注意事項(xiàng):


在navicat管理工具中,新建查詢。


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


-- 調(diào)用過程

call porcedureName ();

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


name

admin

admin1




刪除存儲(chǔ)過程


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

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

(輸出的參數(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;

此過程接受三個(gè)參數(shù), 分別用于獲取訂單表的最小、平均、最大價(jià)格。每個(gè)參數(shù)必須具有指定的類

型,這里使用十進(jìn)制值(decimal(8,2)), 關(guān)鍵字OUT指出相應(yīng)的參數(shù)用來從存儲(chǔ)過程傳出

一個(gè)值(返回給調(diào)用者)


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

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


-- 由于過程指定三個(gè)參數(shù), 故調(diào)用必須要參數(shù)匹配

call procedureName(@min, @avg, @max);

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

(傳遞輸出參數(shù)時(shí),都要這樣前面加一個(gè)@)


select @min, @avg, @max;

結(jié)果如下


@min @avg @max

42.00 601.00 2222.00



使用in參數(shù), 輸入一個(gè)用戶id, 返回該用戶所有訂單的總價(jià)格。


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)用存儲(chǔ)過程


call getTotalById(1, @total);

select @total;

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


復(fù)雜一點(diǎn)的過程, 根據(jù)用戶id獲取該用戶的所有訂單價(jià)格, 并動(dòng)態(tài)的選擇是否加稅。代碼設(shè)計(jì)如下


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 ? -- 我的電腦運(yùn)行這里會(huì)報(bào)錯(cuò),后面發(fā)現(xiàn)是無法識(shí)別order表,改成這樣就好了`order` ?

? ? where r.u_id = userId

? ? into tmptotal;

? ??

? ? if falg then

? ? ? ? select tmptotal + (tmptotal/1000*taxrate) into tmptotal;

? ? end if;

? ??

? ? select tmptotal into total;

END;

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


call getTotalByUser2(1, false, @total); -- 不加稅 ? 100

call getTotalByUser2(1, true, @total); ?-- 加稅 ? ?100.66

select @total;

參考自mysql必知必會(huì), 轉(zhuǎn)載請(qǐng)注明出處。







本文轉(zhuǎn)自建波李 51CTO博客,原文鏈接:http://blog.51cto.com/jianboli/1884019,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的mySql存储过程,简单实现实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。