1. 程式人生 > >MYSQL儲存過程(六)

MYSQL儲存過程(六)

1、MySQL執行流程,通過儲存過程,可以避免重複語法分和編譯,提高執行效率
2、儲存過程:
(1)是SQL語句與控制語句的【預編譯集合】,以【一個名稱儲存】作為【一個單元處理】
(2)優點:
· 增強了語句的功能和靈活性:可以通過控制語句對流程進行控制和判斷
· 實現較快的執行速度,只在【第一次呼叫時進行語法分析和編譯】 ,以後直接從記憶體中得到結果
· 減少網路流量

儲存過程語法結構解析
1.建立儲存過程
CREATE
[DEFINER = {userCURRENT_USER}]
PROCEDURE sp_name ([proc_parameter[,…]]) //可以帶0到多個引數
[characteristic …] routine_body
其中引數
proc_parameter:
[IN OUT INOUT] param_name type
ps:
IN, 表示該引數的值必須在呼叫儲存過程時指定
OUT, 表示該引數的值可以被儲存過程改變,並且可以返回
INOUT, 表示該引數的值呼叫時指定,並且可以被改變和返回
2.特性
COMMENT ‘string’
{CONTAINS SQL NO SQL READS SQL DATA MODIFIES SQL DATA SQL SECURITY{DEFINER INVOKER}
ps:
COMMENT:註釋
CONTAINS SQL:包含SQL語句, 但不包含讀或寫資料的語句
NO SQL:不包含SQL語句
READS SQL DATA:包含讀資料的語句
MODIFIES SQL DATA:包含寫資料的語句
SQL SECURITY {DEFINERINVOKER}指明誰有許可權來執行
3.過程體
(1)過程體由合法的SQL語句構成;
(2)過程體可以是任意SQL語句;(增刪改查)
(3)過程體如果為複合結構則使用BEGIN…END語句
(4)複合結構可以使用條件、迴圈等控制語句

使用儲存過程
建立沒有引數的儲存過程
CREATE PROCEDURE sp1() SELECT VERSION();

/建立例項程式碼(引數名不能和表中的欄位名相同)/
建立帶有INT型別引數的儲存過程:
DELIMITER // //定界符
CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED) //int 是資料型別
BEGIN DELETE FROM users WHERE id = p_id;
END
// //結束
DELIMITER ;

建立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 - 就是使用者變數

建立帶有多個OUT型別引數的儲存過程
INSERT test(username) VALUES(‘A’),(‘B,’),(‘C’);
SELECT ROW_COUNT(); //返回被插入的記錄總數
SELECT * FROM test;
UPDATE test SET username = CONTCAT(username, ‘–immoc’) WHERE id <= 2;
SELECT row_COUNT(); //返回更新的記錄總數

DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT delNums SMALLINT UNSIGNED, OUT leftNums SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age; //注意變數不同
SELECT ROW_COUNT() INTO delNums; //返回插入、刪除和更新的受影響的記錄總數
SELECT COUNT(id) FROM users INTO leftNums;
END

修改儲存過程:(修改註釋,名稱,不能修改過程體)
ALTER PROCEDURE sp_name [characteristic]
COMMENT ‘string’
{CONTAINS SQLNO SQLREADS SQL DATAMODIFIES SQL DATA}
SQL SECURITY{DEFINERINVOKER}

刪除儲存過程:
DROP PROCEDURE [IF EXISTS] sp_name;

呼叫儲存過程
CALL sp_name([parameter[,…]]) //帶引數的儲存過程的呼叫
CALL sp_name[()] //不帶引數的儲存過程呼叫
CALL sp1; or CALL sp1();