mysql命令執行流程:mysql
當成功輸入sql命令之後,mysql引擎會首先對輸入的命令進行語法分析,語法正確的話變成成mysql引擎能夠識別的命令執行,而且把執行結果返回給客戶端sql
存儲過程定義:網絡
存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲並做爲一個單元處理,存儲過程採用預編譯,即第一次編譯以後,會把結果存於內存中供下次調用函數
存儲過程的優勢:
1.加強SQL語句的功能和靈活性
2.實現較快的執行速度(但第一次調用存儲過程的速度和MySQL語句的執行流程是同樣的,由於要語法分析)
3.減小網絡流量spa
一、存儲過程語法結構分析
CREATE
[DEFINER = {user|CURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,...]]) //能夠帶0到多個參數
[characteristic ...] routine_body
其中參數
proc_parameter:
[IN | OUT | INOUT] param_name type
IN, 表示該參數的值必須在調用存儲過程時指定
OUT, 表示該參數的值能夠被存儲過程改變,而且能夠返回
INOUT, 表示該參數的值調用時指定,而且能夠被改變和返回
2.特性
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}指明誰有權限來執行
3.過程體
(1)過程體由合法的SQL語句構成;
(2)過程體能夠是任意SQL語句;
(3)過程體若是爲複合結構則使用BEGIN...END語句
(4)複合結構可使用條件、循環等控制語句內存
建立不帶參數的存儲過程:
1.建立沒有參數的存儲過程
CREATE PROCEDURE sp1() SELECT VERSION();
2.調用存儲過程
CALL sp_name([parameter[,...]]) - 帶參數的存儲過程的調用
CALL sp_name[()] - 不帶參數的存儲過程調用
CALL sp1;
CALL sp1();rem
建立帶有INT類型參數的存儲過程
DELIMITER // //定界符
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED) //int 是數據類型
BEGIN DELETE FROM users WHERE id = p_id;
END
//結束
DELIMITER ;
修改存儲過程
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;string
建立帶有IN OUT類型參數的存儲過程
DELIMITER //
CREATE PROCEDURE removerUserAndReturnUserName(IN showID INT UNSIGNED,OUT showName INT UNSIGNED)
BEGIN
DELETE FROM user WHERE id = showID;
SELECT count(ID) FROM user INTO showName;
END
//
SELECT count(ID) FROM user INTO showName; /** 該語句中的 INTO 含義就是將 SELECT 語句結果的表達式返回到 showName 變量中 */
CALL removerUserAndReturnUserName(10,@nums); /** @nums 所表明的就是用戶變量,可用 SELECT @nums 輸出 */
用 DECLARE 聲明的變量是局部變量,局部變量只能存在於 BEGIN...END 之間,且聲明時必須置於 BEGIN...END 的第一行
而經過 SELECT...INTO.../SET @id = 07 這種方法設置的變量咱們稱之爲用戶變量,只能存在於當前用戶所使用的客戶端有效。
CALL rmUserAndRtUserNums(27, @nums);
SELECT @nums; //@nums - 就是用戶變量
DECLARE聲明的變量都是在BEGIN與END之間,是局部變量
SET @i = 7; //經過@或SET設置的變量稱爲用戶變量編譯
存儲過程與自定義函數的區別
A、存儲過程實現的功能相對複雜,函數針對性較強
B、存儲過程能夠返回多個值,函數只能有一個返回值
C、存儲過程通常獨立執行,函數能夠做爲 sql 語句的組成部分來出現變量
(1)存儲過程實現的功能較複雜,常常針對表作操做; 函數針對性比較強,不多用於對錶作操做; (2)存儲過程能夠有多個返回值; 而函數只能有一個返回值; (3)存儲過程通常獨立執行; 函數能夠做爲其餘SQL語句的組成部分出現。