首頁  >  文章  >  資料庫  >  Mysql變數、遊標及預存程序的應用

Mysql變數、遊標及預存程序的應用

齐天大圣
齐天大圣原創
2020-05-28 11:36:591600瀏覽

Mysql自5.0起就支援預存程序,預存程序通俗的講就是在一段封裝過的SQL,但不只SQL那麼簡單,通常還會有變數、條件判斷、循環體,遊標等。

預存程序的作用

在許多場景中,需要將多個表的資料處理,來產生新的我們需要的數據。這些多個表的資料並不能透過連接等查詢方式給出,只能透過判斷和循環才能產生。這個時候,就可以利用預存程序來實現。

此外,預存程序還有一些好處,例如效能比較高,還有能減少網路請求。如果不用預存程序來實現的話,使用php來實作就需要呼叫多次mysql,產生多次請求。

當然,預存程序也不是沒有缺點的,它比較哪調式,另外不支援叢集。

建立預存程序

建立預存程序語法如下:

CREATE PROCEDURE 过程名(参数) 
BEGIN
 过程体
END

關於參數,設定參數語法為

[IN|OUT|INOUT] 參數名稱類型

  • IN 表示該變數只能在過程體內使用

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

  • INOUT 表示在過程體內和體外都能使用

下面,我們來創建一個最簡單的儲存過程。

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

變數

在MySQL中變數分為全域變數和局部變數。

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

SET @name='gwx';

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

DECLARE x int DEFAULT 0;

下面我們來完成一個預存程序:根據路程計算車費,3公里內以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,每次迴圈取得一筆記錄。

定義一個遊標:

declare 游标名 CURSOR FOR SELECT 语句

開啟關閉遊標:

  • #open 遊標名稱

  • close 遊標名

取遊標資料:

FETCH 游标名 INTO 变量名

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

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

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,以結束迴圈。

以上是Mysql變數、遊標及預存程序的應用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn