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)文章!