MySQL學習筆記(十五)存儲過程

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語句的組成部分來實現。

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