偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

MySQL基礎教程之存儲過程

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

存儲過程

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

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

為什么要使用存儲過程

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

一個簡單的存儲過程

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

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

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

該存儲過程沒有參數(shù), 只是在調(diào)用的時候查詢了用戶表的用戶名而已, 調(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 

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

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

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

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

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

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

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

  1. select @min, @avg, @max

結(jié)果如下

@min @avg @max
42.00 601.00 2222.00

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

  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ù)用戶id獲取該用戶的所有訂單價格, 并動態(tài)的選擇是否加稅。代碼設計如下

  1. create procedure getTotalByUser2( 
  2.     in userId int
  3.     in falg boolean, -- 是否加稅標記 
  4.     out total decimal(8,2) 
  5. begin 
  6.     DECLARE tmptotal DECIMAL(8,2); 
  7.     DECLARE taxrate int DEFAULT 6;-- 默認的加稅的利率 
  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 

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

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

 

責任編輯:龐桂玉 來源: 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ù)組實例

2009-06-22 09:23:18

事件監(jiān)聽器

2011-04-15 09:20:56

ASP.NET MVC

2010-06-13 11:21:32

MySQL 5.0

2009-07-24 10:09:08

ASP.NET個性化ASP.NET基礎教程

2010-06-11 13:53:54

UML建模

2021-07-16 07:21:45

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

2009-10-21 17:36:36

VB基礎教程

2021-02-06 07:49:48

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

2011-07-07 13:58:13

Windows 200活動目錄

2009-10-26 09:04:35

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

2017-12-12 07:47:59

dockermarathon服務器

2011-07-18 09:35:29

iPhone 框架

2009-07-22 13:32:43

iBATIS DAO

2010-06-28 09:21:04

SQL Server存

2011-09-13 16:39:50

Android UI設

2011-07-21 10:17:53

java

2022-09-29 07:27:50

DaprKubernetes
點贊
收藏

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