mysql數據庫儲存過程

mysql數據庫儲存過程

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