首頁  >  文章  >  資料庫  >  mysql預存程序的詳細介紹(程式碼範例)

mysql預存程序的詳細介紹(程式碼範例)

不言
不言轉載
2019-02-27 13:42:442828瀏覽

這篇文章帶給大家的內容是關於mysql預存程序的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

1、什麼是預存程序

為以後的使用而保存的一條或多條MySQL語句的集合。  

預存程序思想上就是資料庫 SQL 語言層面的程式碼封裝與重複使用。

(相關推薦:MySQL教學

2、為什麼要使用預存程序

  1. 把處理封裝在容易使用的單元中,簡化複雜的操作

  2. 防止錯誤保證了資料的一致性

  3. 簡化對變動的管理。 (修改對應表名、列名等修改對應預存程序的程式碼,對於使用的人不需要知道變化)

  4. #提高效能

  5. 靈活

總的來說是簡單、安全、高效能
缺點:

  1. #寫比SQL語句複雜

  2. 權限問題(可能無權、一般都是使用預存程序、沒有建立預存程序的權限)

3、建立預存程序

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、使用預存程序

預存程序其實是一種函數

CALL productpricing();

4、刪除預存程序

    drop procedure productpricing;
    drop procedure if EXISTS productpricing;

5、使用參數

一般,預存程序不會顯示結果,而是把結果回傳給你指定的變數 
變數(variable)記憶體中一個特定的位置,用來暫時儲存資料。

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指出對應的參數用來從預存程序傳出 一個值(回傳給呼叫者)。
MySQL支援IN(傳遞給預存程序)、
OUT(從存 儲程序傳出,如這裡所用)
INOUT(對預存程序傳入和傳出)類型的參 數。

變數名稱 所有MySQL變數都必須以@開始。
呼叫儲存程序

call productpricing(@pricelow,@pricehign,@priceaverage);

#查詢

#
SELECT @priceaverage;
SELECT @priceaverage,@pricehign,@pricelow;

使用in和out
建立

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;

呼叫

call ordertotal(20005,@total);

查詢

select @total;

6、建立智慧型預存程序

迄今為止所使用的所有預存程序基本上都是封裝MySQL簡單的SELECT語句。雖然它們全都是有效的儲存過程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西。那就是使事情更複雜)。只有在儲存過程內包含業務規則和智慧處理時,它們的威力才真正顯現出來。

   考虑这个场景。你需要获得与以前一样的订单合计,但需要对合计增加营业税,不过只针对某些顾客(或许是你所在州中那些顾客)。那么,你需要做下面几件事情:
   1、获得合计(和以前一样)
   2、把营业税有条件的添加到合计
   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;
此存储过程有很大的变动。首先,增加了注释(前面放置 --)。在存储过程复杂性增加时,这样做特别重要。  
添加了另外一个参数 taxable,它是一个布尔值(如果要增加税则为真,否则为假)。  
在存储过程体中,用 DECLARE语句定义了两个局部变量。 DECLARE要求指定变量名和数据类型,
它也支持可选的默认值(这个例子中的 taxrate的默认被设置为 6%)。SELECT 语句变,因此其结果存储到 total(局部变量)而不是 ototal。  
IF 语句检查taxable是否为真,如果为真,则用另一SELECT语句增加营业税到局部变量 total。

最后,用另一SELECT语句将total(它增加或许不增加营业税)保存到 ototal。  
注意:COMMENT关键字 ,本例子中的存储过程在 CREATE PROCEDURE语句中包含了一个 COMMENT值。  
它不是必需的,但如果给出,将在SHOW PROCEDURE STATUS的结果中显示。

这显然是一个更高级,功能更强的存储过程。为试验它,请用以下两条语句:  
第一条:
call ordertotal(20005, 0, @total);
SELECT @total;
输出:
+--------+
| @total |
+--------+
|  38.47 |
+--------+
第二条:
call ordertotal(20009, 1,@total);
SELECT @total;
输出:
+--------+
| @total |
+--------+
|  36.21 |
+--------+
BOOLEAN值指定为1 表示真,指定为 0表示假(实际上,非零值都考虑为真,只有 0被视为假)。通过给中间的参数指定 0或1 ,可以有条件地将营业税加到订单合计上。

這個範例給出了 MySQL的IF 語句的基本用法。 IF語句也支援 ELSEIF和ELSE 子句(前者也使用 THEN子句,後者不使用)。在以後章節中我們將會看到 IF的其他用法(以及其他流控制語句)。

7、檢查預存程序

為顯示用來建立一個預存程序的CREATE語句

show create PROCEDURE ordertotal;

為了取得包含何時、由誰建立等詳細資訊的預存程序列表

show procedure status;

表比較多,用like過濾

show procedure status like 'ordertotal';

#

以上是mysql預存程序的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除