共計 3285 個字符,預計需要花費 9 分鐘才能閱讀完成。
自動寫代碼機器人,免費開通
這篇文章主要介紹 mysql 存儲過程的案例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1、什么是存儲過程
為以后的使用而保存的一條或多條 MySQL 語句的集合。
存儲過程思想上就是數(shù)據(jù)庫 SQL 語言層面的代碼封裝與重用。
(相關推薦:MySQL 教程)
2、為什么要使用存儲過程
把處理封裝在容易使用的單元中,簡化復雜的操作
防止錯誤保證了數(shù)據(jù)的一致性
簡化對變動的管理。(修改對應表名、列名等修改對應存儲過程的代碼,對于使用的人不需要知道變化)
提高性能
靈活
總的來說是簡單、安全、高性能
缺點:
編寫比 SQL 語句復雜
權(quán)限問題(可能無權(quán)、一般都是使用存儲過程、沒有創(chuàng)建存儲過程的權(quán)限)
3、創(chuàng)建存儲過程
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END
注意:在命令行中輸入的問題
mysql delimiter //
mysql CREATE PROCEDURE productpricing()
- BEGIN
- SELECT Avg(prod_price) AS priceaverage
- FROM products;
- END //
4、使用存儲過程
存儲過程實際上是一種函數(shù)
CALL productpricing();
4、刪除存儲過程
drop procedure productpricing;drop procedure if EXISTS productpricing;
5、使用參數(shù)
一般,存儲過程并不顯示結(jié)果,而是把結(jié)果返回給你指定的變量
變量 (variable) 內(nèi)存中一個特定的位置,用來臨時存儲數(shù)據(jù)。
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;
關鍵字 OUT 指出相應的參數(shù)用來從存儲過程傳出 一個值 (返回給調(diào)用者)。
MySQL 支持 IN(傳遞給存儲過程)、
OUT(從存 儲過程傳出,如這里所用)
INOUT(對存儲過程傳入和傳出) 類型的參 數(shù)。
變量名 所有 MySQL 變量都必須以 @開始。
調(diào)用存儲過程
call productpricing(@pricelow,@pricehign,@priceaverage);
查詢
SELECT @priceaverage;
SELECT @priceaverage,@pricehign,@pricelow;
使用 in 和 out
創(chuàng)建
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;
調(diào)用
call ordertotal(20005,@total);
查詢
select @total;
6、建立智能存儲過程
迄今為止使用的所有存儲過程基本上都是封裝 MySQL 簡單的 SELECT 語句。雖然它們?nèi)际怯行У拇鎯^程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西。那就是使事情更復雜)。只有在存儲過程內(nèi)包含業(yè)務規(guī)則和智能處理時,它們的威力才真正顯現(xiàn)出來。
考慮這個場景。你需要獲得與以前一樣的訂單合計,但需要對合計增加營業(yè)稅,不過只針對某些顧客(或許是你所在州中那些顧客)。那么,你需要做下面幾件事情:1、獲得合計(和以前一樣)2、把營業(yè)稅有條件的添加到合計
3、返回合計(帶或不帶稅的)
我們輸入如下代碼:
-- Name: ordertotal // 添加注釋
-- Parameters: onumber = order number
-- taxable = 0 if not taxable, 1 if taxtable
-- ototal = order total variable
CREATE PROCEDURE ordertotal (
IN onumber INT,
IN taxable BOOLEAN,
OUT ototal DECIMAL(8,2)
) COMMENT Obtain order total, optionally adding tax
BEGIN
-- Declare variable for total
DECLARE total DECIMAL(8,2); // 聲明變量
-- Declare tax percentage
DECLARE taxrate INT DEFAULT 6;
-- Get the order total
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- Is this taxable?
IF taxable THEN
-- yes,so add taxrate to the total
SELECT total+(total/100*taxrate) INTO total;
END IF;
-- And finally, save to out variable
SELECT total INTO ototal;
END;
此存儲過程有很大的變動。首先,增加了注釋(前面放置 --)。在存儲過程復雜性增加時,這樣做特別重要。添加了另外一個參數(shù) taxable,它是一個布爾值(如果要增加稅則為真,否則為假)。在存儲過程體中,用 DECLARE 語句定義了兩個局部變量。DECLARE 要求指定變量名和數(shù)據(jù)類型,它也支持可選的默認值(這個例子中的 taxrate 的默認被設置為 6%)。SELECT 語句變,因此其結(jié)果存儲到 total(局部變量)而不是 ototal。IF 語句檢查 taxable 是否為真,如果為真,則用另一 SELECT 語句增加營業(yè)稅到局部變量 total。最后,用另一 SELECT 語句將 total(它增加或許不增加營業(yè)稅)保存到 ototal。注意:COMMENT 關鍵字,本例子中的存儲過程在 CREATE PROCEDURE 語句中包含了一個 COMMENT 值。它不是必需的,但如果給出,將在 SHOW PROCEDURE STATUS 的結(jié)果中顯示。這顯然是一個更高級,功能更強的存儲過程。為試驗它,請用以下兩條語句:第一條:
call ordertotal(20005, 0, @total);
SELECT @total;
輸出:
+--------+
| @total |
+--------+
| 38.47 |
+--------+
第二條:
call ordertotal(20009, 1,@total);
SELECT @total;
輸出:
+--------+
| @total |
+--------+
| 36.21 |
+--------+
BOOLEAN 值指定為 1 表示真,指定為 0 表示假(實際上,非零值都考慮為真,只有 0 被視為假)。通過給中間的參數(shù)指定 0 或 1,可以有條件地將營業(yè)稅加到訂單合計上。
這個例子給出了 MySQL 的 IF 語句的基本用法。IF 語句還支持 ELSEIF 和 ELSE 子句(前者還使用 THEN 子句,后者不使用)。在以后章節(jié)中我們將會看到 IF 的其他用法(以及其他流控制語句)。
7、檢查存儲過程
為顯示用來創(chuàng)建一個存儲過程的 CREATE 語句
show create PROCEDURE ordertotal;
為了獲得包括何時、由誰創(chuàng)建等詳細信息的存儲過程列表
show procedure status;
表比較多,用 like 過濾
show procedure status like ordertotal
以上是“mysql 存儲過程的案例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業(yè)資訊頻道!
向 AI 問一下細節(jié)
丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!