mysql數據庫的 ‘儲存過程’ 其實就是把多個select操做的語句封裝起來,再給他們一個名稱用來之後的調用,你能夠理解爲python中的函數,差很少html
優勢python
1 經過吧處理封裝在容易使用的單元中,簡化複雜的操做mysql
2 因爲不要求反覆創建一系列處理步驟,這保證了數據的完整性。若是開發人員和應用程序都使用了同一存儲過程,則所使用的代碼是相同的。還有就是防止錯誤,須要執行的步驟越多,出錯的可能性越大。防止錯誤保證了數據的一致性。web
3 簡化對變更的管理。若是表名、列名或業務邏輯有變化。只須要更改存儲過程的代碼,使用它的人員不會改本身的代碼了都。sql
4 提升性能,由於使用存儲過程比使用單條SQL語句要快數據庫
5 存在一些職能用在單個請求中的MySQL元素和特性,存儲過程可使用它們來編寫功能更強更靈活的代碼安全
換句話說3個主要好處簡單、安全、高性能svg
缺點函數
1 通常來講,存儲過程的編寫要比基本的SQL語句複雜,編寫存儲過程須要更高的技能,更豐富的經驗。性能
2 你可能沒有建立存儲過程的安全訪問權限。許多數據庫管理員限制存儲過程的建立,容許用戶使用存儲過程,但不容許建立存儲過程
存儲過程是很是有用的,應該儘量的使用它們
建立儲存過程:
CREATE PROCEDURE 存儲過程名()
一個例子說明:一個返回產品平均價格的存儲過程以下代碼: CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END;
//建立存儲過程名爲productpricing,若是存儲過程須要接受參數,能夠在()中列舉出來。即便沒有參數後面仍然要跟()。BEGIN和END語句用來限定存儲過程體,過程體自己是個簡單的SELECT語句
在MYSQL處理這段代碼時會建立一個新的存儲過程productpricing。沒有返回數據。由於這段代碼時建立而不是使用存儲過程。
Mysql命令行客戶機的分隔符
默認的MySQL語句分隔符爲分號 ; 。Mysql命令行實用程序也是 ; 做爲語句分隔符。若是命令行實用程序要解釋存儲過程自身的 ; 字符,則他們最終不會成爲存儲過程的成分,這會使存儲過程當中的SQL出現句法錯誤
解決方法是臨時更改命令實用程序的語句分隔符
DELIMITER // //定義新的語句分隔符爲// CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END // DELIMITER ; //改回原來的語句分隔符爲 ; 除\符號外,任何字符均可以做爲語句分隔符 CALL productpricing(); //使用productpricing存儲過程 執行剛建立的存儲過程並顯示返回的結果。由於存儲過程其實是一種函數,因此存儲過程名後面要有()符號
刪除儲存過程
DROP PROCEDURE productpricing ; //刪除存儲過程後面不須要跟(),只給出存儲過程名 爲了刪除存儲過程不存在時刪除產生錯誤,能夠判斷僅存儲過程存在時刪除 DROP PROCEDURE IF EXISTS
通常存儲過程並不顯示結果,而是把結果返回給你指定的變量
CREATE PROCEDURE productpricing( OUT p1 DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2), ) BEGIN SELECT Min(prod_price) INTO p1 FROM products; SELECT Max(prod_price) INTO ph FROM products; SELECT Avg(prod_price) INTO pa FROM products; END;
此存儲過程接受3個參數,p1存儲產品最低價格,ph存儲產品最高價格,pa存儲產品平均價格。每一個參數必須指定類型,這裏使用十進制值。關鍵字OUT指出相應的參數用來從存儲過程傳給一個值(返回給調用者)。MySQL支持IN(傳遞給存儲過程)、OUT(從存儲過程當中傳出、如這裏所用)和INOUT(對存儲過程傳入和傳出)類型的參數。存儲過程的代碼位於BEGIN和END語句內,如前所見,它們是一些列SELECT語句,用來檢索值,而後保存到相應的變量(經過INTO關鍵字)
調用修改過的存儲過程必須指定3個變量名:
CALL productpricing(@pricelow , @pricehigh , @priceaverage); 這條CALL語句給出3個參數,它們是存儲過程將保存結果的3個變量的名字 變量名 全部的MySQL變量都必須以@開始 使用變量 SELECT @priceaverage ; SELECT @pricelow , @pricehigh , @priceaverage ; //得到3給變量的值
下面是另外一個例子,此次使用IN和OUT參數。ordertotal接受訂單號,並返回該訂單的合計
CREATE PROCEDURE ordertotal( IN onumber INT, OUT ototal DECIMAL(8,2) ) BEGIN SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal; END; //onumber定義爲IN,由於訂單號時被傳入存儲過程,ototal定義爲OUT,由於要從存儲過程當中返回合計,SELECT語句使用這兩個參數,WHERE子句使用onumber選擇正確的行,INTO使用ototal存儲計算出來的合計 爲了調用這個新的過程,可使用下列語句: CALL ordertotal(2005 , @total); //這樣查詢其餘的訂單總計可直接改變訂單號便可 SELECT @total;
基本的簡單應用這樣就是能夠了,若是你還要細看的話,能夠借鑑一下這個博客:
https://www.cnblogs.com/l5580/p/5993238.html