1. 一般輸入指令時的執行過程如下所示:
SQL指令-->MySQL引擎-->(分析)語法正確-->(編譯)可識別命令-->(執行)執行結果-->(返回)客戶端
2. 存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作爲一個單元處理。效率高於簡單的SQL語句,因爲只在第一次進行檢查和編譯,後續直接查看編譯結果即可,省略了中間的兩個環節。
3. 存儲過程的特點
(1) 增強SQL語句的功能和靈活性
(2) 實現較快的執行速度
(3) 減少網絡流量
4. 創建存儲過程
CREATE [DEFINER = {user | CURRENT_USER}] PROCEDURE sp_name ([parameter [,...]]) [characteristic ...] routine_body
(1) 其中過程參數pro_parameter:[IN | OUT |INOUT] parameter_name types
IN:表示該參數的值必須在調用存儲過程時指定
OUT:表示該參數的值可以被存儲過程改變,並且可以返回
INOUT:表示該參數在調用時指定,並且可以被改變和返回
(2) 特性:
COMMENT 'string' | {CONSTRAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER}
5. 過程體
(1) 過程體由合法的SQL語句構成
(2) 過程體可以是“任意”SQL語句,“任意”針對數據表的增、刪、改、查及多表連接語句
(3) 過程體如果爲複合結構,則使用BEGIN ... END語句
(4) 複合結構可以包含聲明、循環、控制結構
6. 調用存儲過程的方法有兩種:
(1) CALL sp_name([parameter [,...]]),對應當存儲過程帶有參數
(2) CALL sp_name[()],對應創建沒有參數的存儲過程
7. 創建不帶參數的存儲過程
//該存儲過程欲實現獲取MySQL版本的信息
CREATE PROCEDURE sp1()
BEGIN
SELECT VERSION();
END
//調用存儲過程
CALL sp1();//等價於CALL sp1;
8. 創建帶有IN參數的存儲過程
//切換結束標識
DELIMITER //
//創建存儲過程,注意IN對應的參數名不能和數據表中的記錄字段名相同
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
END
DELIMITER ;
//調用存儲過程
CALL removeUserById(3);
9. 修改存儲過程,注意不能修改過程體
ALTER PROCEDURE sp_name [characteristic ...]
10. 刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name;
11. 創建帶有IN和OUT類型參數的存儲過程
DELIMITER //
CREATE PROCEDURE removeUserAndReturnUserNums(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT COUNT(id) FROM users INTO userNums; //將統計結果放入變量中
END
DELIMITER ;
//調用:
CALL removeUserAndReturnUserNums(27,@nums);
SELECT @nums;
注意:
(1) 在BEGIN與END之間DECLARE聲明的變量都是局部變量,而且聲明語句必須位於第一行,作用範圍也在BEGIN與END之間
(2) SEt @i = 7;其中i指的是用戶變量,與MySQL客戶端綁定,因此只對用戶所使用的客戶端有效。
12. 創建帶有多個OUT類型參數的存儲過程
ROW_COUNT();語句的作用是獲取插入、刪除、更新被影響到的記錄總數
//創建存儲過程,根據年齡刪除用戶,並返回刪除用戶數及剩餘的用戶數
DELIMITER //
CREATE PROCEDURE removeUserByIdAndReturnInfos(IN p_age SMALLINT UNSIGNED NOT NULL, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age;
SELECT ROW_COUNT() INTO deleteUsers;
SELECT COUNT(id) FROM users INTO userCounts;
END
DELIMITER ;
//訪問該存儲過程
CALL removeUserByIdAndReturnInfos(20,@a,@b);
SELECT @a,@b;
13. 存儲過程與自定義函數的區別
(1) 存儲過程的功能要複雜一些,自定義函數針對性更強
(2) 存儲過程可返回多個值,自定義函數只能返回一個值
(3) 存儲過程一般獨立運行,自定義函數可做爲其他SQL語句的組成部分來實現。
MySQL學習筆記(十五)存儲過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.