自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL基礎(chǔ)教程之存儲過程

數(shù)據(jù)庫 MySQL
存儲過程簡單來說,就是為以后的使用而保存的一條或多條MySQL語句的集合??蓪⑵湟暈榕?,雖然它們的作用不僅限于批處理。在我看來, 存儲過程就是有業(yè)務(wù)邏輯和流程的集合, 可以在存儲過程中創(chuàng)建表,更新數(shù)據(jù), 刪除等等。

存儲過程

存儲過程簡單來說,就是為以后的使用而保存的一條或多條MySQL語句的集合??蓪⑵湟暈榕m然它們的作用不僅限于批處理。

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

為什么要使用存儲過程

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

一個(gè)簡單的存儲過程

  1. create procedure porcedureName () 
  2. begin 
  3.     select name from user
  4. end 

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

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

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

name
admin
admin1
admin2
admin3

刪除存儲過程

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

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

  1. create procedure procedureName( 
  2.     out min decimal(8,2), 
  3.     out avg decimal(8,2), 
  4.     out max decimal(8,2) 
  5. BEGIN 
  6.     select MIN(price) INTO min from order
  7.     select AVG(price) into avg from order
  8.     select MAX(price) into max from order
  9. END 

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

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

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

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

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

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

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

  1. select @min, @avg, @max

結(jié)果如下

@min @avg @max
42.00 601.00 2222.00

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

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

調(diào)用存儲過程

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

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

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

  1. create procedure getTotalByUser2( 
  2.     in userId int
  3.     in falg boolean, -- 是否加稅標(biāo)記 
  4.     out total decimal(8,2) 
  5. begin 
  6.     DECLARE tmptotal DECIMAL(8,2); 
  7.     DECLARE taxrate int DEFAULT 6;-- 默認(rèn)的加稅的利率 
  8.      
  9.     select SUM(r.price) from order r 
  10.     where r.u_id = userId 
  11.     into tmptotal; 
  12.      
  13.     if taxable then 
  14.         select tmptotal + (tmptotal/1000*taxrate) into tmptotal; 
  15.     end if; 
  16.      
  17.     select tmptotal into total; 
  18. END 

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

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

 

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2017-07-18 10:14:23

OracleMerge into教程

2010-05-12 17:55:30

MySQL 5.0

2009-07-24 09:20:15

數(shù)組實(shí)例

2011-04-15 09:20:56

ASP.NET MVC

2009-06-22 09:23:18

事件監(jiān)聽器

2010-06-13 11:21:32

MySQL 5.0

2009-07-24 10:09:08

ASP.NET個(gè)性化ASP.NET基礎(chǔ)教程

2021-07-16 07:21:45

C++可調(diào)用對象std::functi

2009-10-21 17:36:36

VB基礎(chǔ)教程

2010-06-11 13:53:54

UML建模

2011-07-07 13:58:13

Windows 200活動目錄

2021-02-06 07:49:48

C語言編程開發(fā)技術(shù)

2009-10-26 09:04:35

VB.NET數(shù)據(jù)庫基礎(chǔ)

2011-07-18 09:35:29

iPhone 框架

2009-07-22 13:32:43

iBATIS DAO

2017-12-12 07:47:59

dockermarathon服務(wù)器

2011-09-13 16:39:50

Android UI設(shè)

2010-06-28 09:21:04

SQL Server存

2011-07-21 10:17:53

java

2017-07-18 14:40:05

大數(shù)據(jù)數(shù)據(jù)可視化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號