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