Mysql存儲(chǔ)過程有什么作用?如何使用存儲(chǔ)過程?

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

創(chuàng)新互聯(lián)建站服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對(duì)網(wǎng)站進(jìn)行成都網(wǎng)站制作、網(wǎng)站建設(shè)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對(duì)外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

存儲(chǔ)過程的作用

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

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

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

創(chuàng)建存儲(chǔ)過程

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

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

關(guān)于參數(shù),設(shè)置參數(shù)語法為

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

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

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

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

下面,我們來創(chuàng)建一個(gè)最簡(jiǎn)單的存儲(chǔ)過程。

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

變量

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

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

SET @name='gwx';

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

DECLARE x int DEFAULT 0;

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

-- 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;

游標(biāo)

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

定義一個(gè)游標(biāo):

declare 游標(biāo)名 CURSOR FOR SELECT 語句

開啟關(guān)閉游標(biāo):

  • open 游標(biāo)名

  • close 游標(biāo)名

取游標(biāo)數(shù)據(jù):

FETCH 游標(biāo)名 INTO 變量名

可以這么簡(jiǎn)單的介紹,大家會(huì)有疑惑,不清楚應(yīng)該如何去使用。下面,來看一個(gè)實(shí)例,從實(shí)例中學(xué)習(xí)如何使用游標(biāo)。

用游標(biāo)完成一個(gè)非常簡(jiǎn)單的功能,將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; -- 打開游標(biāo)
    WHILE done=0 DO      
        FETCH cur INTO n1,n2;
        
        IF done=0 THEN -- 注意這里為什么加IF條件,不加的話,最后一個(gè)值會(huì)被多加一遍         
      SET sum=sum+n1+n2;
        END IF;
    END WHILE;
    CLOSE cur;  -- 關(guān)閉游標(biāo)
    
    SELECT sum;
END

這里有幾點(diǎn)需要注意,首先局部變量的定義必須要在聲明游標(biāo)前聲明。

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

以上就是Mysql存儲(chǔ)過程應(yīng)用的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!

新聞名稱:Mysql存儲(chǔ)過程有什么作用?如何使用存儲(chǔ)過程?
鏈接URL:http://bm7419.com/article26/jdehcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作