MySQL數據庫——初涉'存儲過程'基本操作(無參,IN,OUT)與變量術語基礎概念

存儲過程

存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並作爲一個單元處理,
存儲過程存儲在數據庫內,可以由應用程序調用執行,而且允許用戶聲明變量,以及進行流程控制,
存儲過程可以接收參數,可以接收輸入類型的參數,也可以接收輸出類型的參數,
並且可以存在多個返回值,存儲過程的效率比一般SQL執行的效率要高

存儲過程的優點

1.增強SQL語句的功能和靈活性
2.實現較快的執行速度
3.減少網絡流量

--創建存儲過程
CREATE [DEFINER = { user|CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body;

--調用存儲過程
CALL sp_name([parameter[,...]]);
CALL sp_name[()];

--修改存儲過程(能修改的內容十分有限,尤其是無法修改過程體)
ALTER PROCEDURE sp_name [characteristic ...];

--刪除存儲過程(若是修改過程體,可直接刪除存儲過程,再重建)
DROP PROCEDURE [IF EXISTS] sp_name;

--proc_parameter: [IN|OUT|INOUT] param_name type
/*
IN:表示該參數的值必須在調用存儲過程時指定;
OUT:表示該參數的值可以被存儲過程改變,並且可以返回;
INOUT:跟 OUT 類似,都可以從存儲過程內部傳值給調用者。不同的是:調用者還可以通過 INOUT 參數傳遞值給存儲過程;
*/
--characteristic:特性
COMMENT 'string'
|{CONTAINS SQL | NO SQL | READS SQL DATA |MODIFIES SQL DATA}
|SQL SECURITY {DEFINER | INVOKER}
/*
COMMENT:註釋
CONTAINS SQL:包含SQL語句,但不包含讀或寫數據的語句
NO SQL:不包含SQL語句
READS SQL DATA:包含讀數據的語句
MODIFIES SQL DATA:包含寫數據的語句
SQL SECURITY {DEFINER | INVOKER}:指明誰有權限來執行
*/

--過程體
/*
1.過程體由合法的SQL語句構成;
2.過程體可以是‘任意’SQL語句(不能創建數據庫,不能創建數據表,主要是對於數據的增刪改查,以及多表連接等等);
3.過程體如果爲複合結構則使用BEGIN...END語句;
4.複合結構可以包含聲明,循環,控制結構;
*/

1.創建不帶參數的存儲過程

--存儲過程示例:
CREATE PROCEDURE sp1() SELECT VERSION();
--就算不帶由參數,還是需要加上sp1後面的小括號

--調用存儲過程(以下兩種格式都可)
CALL sp1;
CALL sp1();

2.創建帶有IN類型參數的存儲過程

--示例(假設前提條件都已滿足):
DELIMITER //  --修改定界符
CREATE PROCEDURE rmUserById(IN p_id INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;  --id爲數據表中的記錄,p_id爲待接收的參數
END
//

--調用存儲過程
DELIMITER ;  --將定界符改爲;
CALL rmUserById(2);

3.創建帶有IN和OUT類型參數的存儲過程

--示例(假設前提條件都已滿足):
DELIMITER //
CREATE PROCEDURE rmUserAndRtUserNums(IN p_id INT UNSIGNED,OUT u_nums INT UNSIGNED)
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT count(id) FROM users INTO u_nums;  --INTO,將SELECT結果放入一個變量中
END
//

--調用存儲過程
DELIMITER ;  --將定界符改爲;
CALL rmUserAndRtUserNums(2,@nums);  --此時,返回值就在@nums中
SELECT @nums;  --查看返回值

--關於本例中這種參數形式,請看本文第五節

4.創建帶有多個OUT類型參數的存儲過程

SELECT ROW_COUNT();
--ROW_COUNT,得到插入、刪除、更新的被影響的記錄總數
--示例(假設前提條件都已滿足):
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age;
SELECT ROW_COUNT() INTO deleteUsers;  --INTO,將SELECT結果放入一個變量中
SELECT COUNT(id) FROM users INTO userCounts;
END
//

--調用存儲過程
DELIMITER ;  --將定界符改爲;
CALL rmUserByAgeAndRtInfos(20,@delUser,@userCou);
SELECT @delUser,@userCou;

5.變量術語基礎概念

1.用戶變量:以”@”開始,形式爲”@變量名”
用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生效
2.全局變量:定義示例,SET @i = 7;對所有客戶端生效。只有具有super權限纔可以設置全局變量
3.會話變量:只對連接的客戶端有效。
4.局部變量:作用範圍在 BEGIN 到 END 語句塊之間。在該語句塊裏設置的變量
DECLARE語句專門用於定義局部變量。SET語句是設置不同類型的變量,包括會話變量和全局變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章