溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Mysql存儲過程有什么作用?如何使用存儲過程?

發(fā)布時間:2020-06-01 21:54:49 來源:億速云 閱讀:426 作者:鴿子 欄目:MySQL數(shù)據(jù)庫

Mysql自5.0起就支持存儲過程,存儲過程通俗的講就是在一段封裝過的SQL,但不僅僅只有SQL那么簡單,通常還會有變量、條件判斷、循環(huán)體,游標等。

存儲過程的作用

在很多場景中,需要將多個表的數(shù)據(jù)處理,來產(chǎn)生新的我們需要的數(shù)據(jù)。這些多個表的數(shù)據(jù)并不能通過連接等查詢方式給出,只能通過判斷和循環(huán)才能產(chǎn)生。這個時候,就可以利用存儲過程來實現(xiàn)。

此外,存儲過程還有一些好處,比如性能比較高,還有能減少網(wǎng)絡請求。如果不用存儲過程來實現(xiàn)的話,使用php來實現(xiàn)就需要調(diào)用多次mysql,產(chǎn)生多次請求。

當然,存儲過程也不是沒有缺點的,它比較哪調(diào)式,另外不支持集群。

創(chuàng)建存儲過程

創(chuàng)建存儲過程語法如下:

CREATE PROCEDURE 過程名(參數(shù)) 
BEGIN
 過程體
END

關于參數(shù),設置參數(shù)語法為

[IN|OUT|INOUT] 參數(shù)名 類型

  • IN 表示該變量只能在過程體內(nèi)使用

  • OUT 表示該變量只能在過程體外使用

  • INOUT 表示在過程體內(nèi)和體外都能使用

下面,我們來創(chuàng)建一個最簡單的存儲過程。

CREATE PROCEDURE p1(IN x INT) 
BEGIN
  SELECT x;
END;

變量

在MySQL中變量分為全局變量和局部變量。

全局變量以@開頭,無需聲明,直接使用即可,如

SET @name='gwx';

局部變量需要先聲明,局部變量的初始化方法如下:

DECLARE x int DEFAULT 0;

下面我們來完成一個存儲過程:根據(jù)路程計算車費,3公里內(nèi)按6遠計算,超過的距離按每公里1.2元計算.

-- distance 路程
CREATE PROCEDURE p1(in distance FLOAT)
BEGIN
  DECLARE d_money FLOAT DEFAULT 0; 
    IF distance>3 THEN 
       SET d_money=6+(distance-3)*1.2;
    ELSE
      SET d_money=6;
    END IF;
    SELECT d_money;
END;

游標

拿php做比較,游標有點想foreach,每次循環(huán)獲取一條記錄。

定義一個游標:

declare 游標名 CURSOR FOR SELECT 語句

開啟關閉游標:

  • open 游標名

  • close 游標名

取游標數(shù)據(jù):

FETCH 游標名 INTO 變量名

可以這么簡單的介紹,大家會有疑惑,不清楚應該如何去使用。下面,來看一個實例,從實例中學習如何使用游標。

用游標完成一個非常簡單的功能,將test_cursor表中數(shù)字全部累加起來。

CREATE TABLE IF NOT EXISTS test_cursor(
  num1 INT(10) UNSIGNED NOT NULL DEFAULT 0,
  num2 INT(10) UNSIGNED NOT NULL DEFAULT 0
);    
INSERT INTO test_cursor(num1,num2) VALUES(1,1),(2,2),(3,3);
 
CREATE PROCEDURE `test_cursor`()
BEGIN
    DECLARE sum INT(10) DEFAULT 0;
    DECLARE n1,n2 INT(10);
    DECLARE done INT DEFAULT 0;
    
    DECLARE cur CURSOR FOR SELECT num1,num2 FROM test_cursor; 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
    
    OPEN cur; -- 打開游標
    WHILE done=0 DO      
        FETCH cur INTO n1,n2;
        
        IF done=0 THEN -- 注意這里為什么加IF條件,不加的話,最后一個值會被多加一遍         
      SET sum=sum+n1+n2;
        END IF;
    END WHILE;
    CLOSE cur;  -- 關閉游標
    
    SELECT sum;
END

這里有幾點需要注意,首先局部變量的定義必須要在聲明游標前聲明。

另外,這里DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 表示游標結束后將done設置為1,以結束循環(huán)。

以上就是Mysql存儲過程應用的詳細內(nèi)容,更多請關注億速云其它相關文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI