MySQL存儲進(jìn)程
存儲進(jìn)程是SQL語句和控制語句的預(yù)編譯集合,以1個名稱存儲并作為1個單元處理。
1、MySQL履行流程,通過存儲進(jìn)程,可以免重復(fù)語法分和編譯,提高履行效力
2、存儲進(jìn)程:
(1)是SQL語句與控制語句的【預(yù)編譯集合】,以【1個名稱存儲】作為【1個單元處理】
(2)優(yōu)點(diǎn):
· 增強(qiáng)了語句的功能和靈活性:可以通過控制語句對流程進(jìn)行控制和判斷
· 實(shí)現(xiàn)較快的履行速度,只在【第1次調(diào)用時進(jìn)行語法分析和編譯】 ,以后直接從內(nèi)存中得到結(jié)果
· 減少網(wǎng)絡(luò)流量
自定義存儲進(jìn)程
1、存儲進(jìn)程語法結(jié)構(gòu)分析
CREATE
[DEFINER = {user|CURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,...]]) //可以帶0到多個參數(shù)
[characteristic ...] routine_body
其中參數(shù)
proc_parameter:
[IN | OUT | INOUT] param_name type
2.特性
COMMENT 'string'
| {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA|SQL SECURITY{DEFINER|INVOKER}
3.進(jìn)程體
創(chuàng)建不帶參數(shù)的存儲進(jìn)程:
語法格式:CREATE PROCEDURE 存儲進(jìn)程名 ([參數(shù)],[參數(shù)]...)
例如:CREATE PROCEDURE sq1() SELECT VERSION();
調(diào)用存儲進(jìn)程
CALL 存儲進(jìn)程名[(參數(shù))],...
例如:CALL sp1();無參可以省略小括號,有參就不能省略
1.創(chuàng)建沒有參數(shù)的存儲進(jìn)程
CREATE PROCEDURE sp1() SELECT VERSION();
2.調(diào)用存儲進(jìn)程
CALL sp_name([parameter[,...]]) - 帶參數(shù)的存儲進(jìn)程的調(diào)用
CALL sp_name[()] - 不帶參數(shù)的存儲進(jìn)程調(diào)用
CALL sp1;
CALL sp1();
2.創(chuàng)建帶有IN類型參數(shù)的存儲進(jìn)程
創(chuàng)建實(shí)例代碼(參數(shù)名不能和表中的字段名相同)
1、修改定界符:DELIMITER new_limiter,1般用'//'代替';'作為定界符
2、通過傳入id刪除字段
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id(傳入的p_id); //【變量名稱不能與字段相同,系統(tǒng)沒法辨認(rèn)
END
//
DELIMITER ;
3、調(diào)用:CALL removeUserById(3); //刪除id=3的記錄
修改存儲進(jìn)程
ALTER PROCEDURE sp_name [characteristic]
COMMENT 'string'
|{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
3.刪除存儲進(jìn)程
DROP PROCEDURE [IF EXISTS] sp_name;
3. 創(chuàng)建帶有IN OUT類型參數(shù)的存儲進(jìn)程,根據(jù)id刪除用戶,并返回剩余用戶數(shù);
DELIMITER //
CREATE PROCEDURE removerUserAndReturnUserName(IN showID INT UNSIGNED,OUT numUsers INT UNSIGNED)
BEGIN
DELETE FROM user WHERE id = showID;
SELECT count(ID) FROM user INTO numUsers;
END
//
SELECT count(ID) FROM user INTO numUsers; /** 該語句中的 INTO 含義就是將 SELECT 語句結(jié)果的表達(dá)式返回到 numUsers 變量中 */
CALL removerUserAndReturnUserName(10,@nums); /** @nums 所代表的就是用戶變量,可用 SELECT @nums 輸出 */
用 DECLARE 聲明的變量是局部變量,局部變量只能存在于 BEGIN…END 之間,且聲明時必須置于 BEGIN…END 的第1行
而通過 SELECT…INTO…/SET @id = 07 這類方法設(shè)置的變量我們稱之為用戶變量,只能存在于當(dāng)前用戶所使用的客戶端有效。
CALL rmUserAndRtUserNums(27, @nums);
SELECT @nums; //@nums - 就是用戶變量
DECLARE聲明的變量都是在BEGIN與END之間,是局部變量
SET @i = 7; //通過@或SET設(shè)置的變量稱為用戶變量
4.創(chuàng)建1帶多個OUT類型參數(shù)的存儲進(jìn)程
1、例子:IN通過年齡刪除數(shù)據(jù)行,OUT返回被刪除的行數(shù)和剩余行數(shù)
2、介紹1個系統(tǒng)函數(shù)ROW_COUNT(),無參,返回上1次CRUD操作影響的行數(shù)
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT delNums SMALLINT UNSIGNED, OUT leftNums SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE WHERE age = p_age; //注意變量不同
SELECT ROW_COUNT() INTO delNums;
SELECT COUNT(id) FROM users INTO leftNums;
END
//
DELIMITER ;
SELECT * FROM users;
SELECT COUNT(id) FROM users WHERE age = 20;
CALL rmUserByAgeAndRtInfos(20, @a, @b);
SELECT * FROM users;
SELECT COUNT(id) FROM users WHERE age = 23;
CALL rmUserByAgeAndRtInfos(23, @a, @b);
SELECT @a, @b;
5.存儲進(jìn)程與自定義函數(shù)的區(qū)分
(1)
存儲進(jìn)程實(shí)現(xiàn)的功能較復(fù)雜,常常針對表做操作;
函數(shù)針對性比較強(qiáng),很少用于對表做操作;
(2)
存儲進(jìn)程可以有多個返回值;
而函數(shù)只能有1個返回值;
(3)
存儲進(jìn)程1般獨(dú)立履行;
函數(shù)可以作為其他SQL語句的組成部份出現(xiàn)。
6.總結(jié):
存儲進(jìn)程:是SQl語句與控制語句的預(yù)編譯集合,以1個名稱存儲并作為1個單元處理
參數(shù):輸入類型,輸出類型,輸入&&輸出
創(chuàng)建:creat.....procedure....
存儲進(jìn)程(call procedure proc_name[(123,@name,@num...)
])
自定義函數(shù)(select func_name(a,b...)
)
注意: