胡厚崑:不管多艱難,華為對創新的投入不會減少
我的小站:我的部落格
1.1 儲存過程簡介
儲存過程是一組為了完成特定功能的SQL語句集合,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數的值
MySQL 5.0 版本開始支援儲存過程。
儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。
儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。
儲存過程思想上很簡單,就是資料庫 SQL 語言層面的程式碼封裝與重用。
1.2 儲存過程的優缺點
優點:
1) 封裝性
儲存過程被建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的 SQL 語句,並且資料庫專業人員可以隨時對儲存過程進行修改,而不會影響到呼叫它的應用程式原始碼。
2) 可增強 SQL 語句的功能和靈活性
儲存過程可以用流程控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。
3) 可減少網路流量
由於儲存過程是在伺服器端執行的,且執行速度快,因此當客戶計算機上呼叫該儲存過程時,網路中傳送的只是該呼叫語句,從而可降低網路負載。
4) 高效能
儲存過程執行一次後,產生的二進位制程式碼就駐留在緩衝區,在以後的呼叫中,只需要從緩衝區中執行二進位制程式碼即可,從而提高了系統的效率和效能。
5) 提高資料庫的安全性和資料的完整性
使用儲存過程可以完成所有資料庫操作,並且可以通過程式設計的方式控制資料庫資訊訪問的許可權。
此資料來自知乎大佬 —— Mysql儲存過程的詳細講解 - 知乎 (zhihu.com)
缺點:
- 儲存過程,往往定製化於特定的資料庫上,因為支援的程式語言不同。當切換到其他廠商的資料庫系統時,需要重寫原有的儲存過程。
- 儲存過程的效能調校與撰寫,受限於各種資料庫系統。
1.3 使用儲存過程
1. 建立儲存過程
使用 CREATE PROCEDURE 語句建立儲存過程。語法格式如下
CREATE PROCEDURE 過程名(過程引數)
[特性]
儲存過程體
說明
常用特性有:
- LANGUAGE SQL:儲存過程語言,預設值為 SQL
- CONTAINS SQL:表示子程式不包含讀或寫資料的語句
- NOT SQL:表示子程式不包含 SQL 語句
- READDS SQL DATA:表示子程式包含讀資料的語句,但不包含寫的語句
- MODIFIES SQL DATA:表示子程式包含寫資料的語句
如果 2~5 這些特徵沒有明確指定,預設值為:CONTAINS SQL
-
SQL SECURITY { DEFINER | INVOKER }:用來指定儲存過程的執行許可權,預設值為 DEFINER
- DEFINER:使用建立者的許可權執行
- INVOKER:使用執行者的許可權執行
下面結合具體例項講解儲存過程的建立過程:
DELIMITER //
CREATE PROCEDURE student(過程引數)
BEGIN
SELECT * FROM student;
END
DELIMITER ;
說明
1)宣告語句分隔符
DELIMITER $$ 或者 DELIMITER //
需注意的是,如果沒有宣告語句分隔符的話,編譯器就會把儲存過程當成 SQL 語句處理,這樣編譯過程就會報錯。
2)定義儲存過程的引數
在 MySQL 中,儲存過程的引數包括 3 種類型
-
IN
:輸入引數:表示呼叫者向過程傳入值(傳入值可以是字面量或變數) -
OUT
: 輸出引數:表示過程向呼叫者傳出值(可以返回多個值)(傳出值只能是變數); -
INOUT
:輸入輸出引數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)。
3)過程提的標識
在定義儲存過程的過程體時,需要標識開始和結束。語法格式如下:
BEGIN …… END 分隔符
2. 呼叫儲存過程
CALL 儲存過程名(引數列表);
3.儲存過程中的變數
DECLARE 變數名 資料型別 [DEFAULT 值]
1.4 檢視儲存過程
1.檢視儲存過程的狀態
類似檢視資料庫中的資料表資訊
SHOW PROCEDURE STATUS;
2.檢視儲存過程的建立程式碼
SHOW CREATE PROCEDURE 儲存過程名;
1.5 修改儲存過程
在MySQL中,使用 ALTER PROCEDURE
語句可以修改已建立的儲存過程,但是僅僅能夠修改儲存過程時定義的特性。語法格式如下:
ALTER PROCEDURE 儲存過程名 [特性 ……]
1.6 刪除儲存過程
類似刪除資料庫中的資料表,MySQL使用者可以使用 DROP PROCEDURE
語句刪除已建立的儲存過程。語法格式如下:
DROP PROCEDURE 儲存過程名;
2. 儲存過程的控制語句
2.1 條件語句
1.IF-ELSEIF-ELSE
條件語句
IF 條件 THEN 語句列表
[ELSEIF 條件 THEN 語句列表]
[ELSE 語句列表]
END IF;
2.CASE
條件語句
在 MySQL 中的 CASE 條件語句有兩種寫法。
第一種語法格式如下:
CASE
WHEN 條件 THEN 語句列表
[WHEN 條件 THEN 語句列表]
[ELSE 語句列表]
END CASE;
在 CASE 語句中,若條件為真,則相應的 SQL 語句列表來執行。
若沒有條件匹配,則在 ELSE 子句裡的語句列表被執行。
另外,CASE 語句只返回第一個符合條件的值,剩下的部分將會被自動忽略。
例項:
定義儲存過程,輸入一個整數,使用 case 語句判斷是正數還是負數,程式碼如下所示:
-- 建立過程
create procedure pro_demo(in num int)
begin
case -- 條件開始
when num < 0 then select '負數';
when num = 0 then select '不是正數也不是負數';
else select '正數';
end case; -- 條件結束
end;
-- 呼叫過程
call pro_demo(1);
執行結果:
正數
正數
第二種語法格式如下:
CASE 列名
WHEN 條件 THEN 語句列表
[WHEN 條件 THEN 語句列表]
[ELSE 語句列表]
END CASE;
例項:
定義儲存過程,輸入一個整數,使用 case 語句判斷是 1 還是 2,程式碼如下所示:
-- 建立過程
create procedure pro_demo(in num int)
begin
case num -- 條件開始
when 1 then select '數值是 1';
when 2 then select '數值是 2';
else select '不是 1 也不是 2';
end case; -- 條件結束
end;
-- 呼叫過程
call pro_demo(3);
執行結果:
不是 1 也不是 2
不是 1 也不是 2
2.2 迴圈語句
1)WHILE 迴圈語句
WHILE
迴圈語句時最普遍使用的迴圈語句,它首先判斷條件是否成立,若成立,則執行迴圈體。語法如下:
while 條件 DO
迴圈體
end while;
例項:
delimiter //
-- 建立過程 使用 while 迴圈輸出 1 到 10 的累加和
create procedure pro_demoWhile(in i int)
begin
declare num int default 0;
declare sum int default 0;
while num < 10 do -- 迴圈開始
set num = num + i;
set sum = sum + num;
end while; -- 迴圈結束
select sum;
end;
-- 呼叫過程
call pro_demoWhile(1);
執行結果:55
2)LOOP 迴圈語句
LOOP
迴圈結構不需要判斷初始條件,直接執行迴圈體,知道遇到 LEAVE
語句才退出迴圈。語法格式如下:
loop_name: LOOP
IF 條件 THEN -- 滿足條件時離開迴圈
LEAVE loop_name; -- 和 break 差不多都是結束迴圈
END IF;
END LOOP;
例項:
delimiter //
-- 建立過程 使用 loop 迴圈輸出 1 到 10 的累加和
create procedure pro_demoLoop(i int)
begin
declare num int default 0;
declare sum int default 0;
#loop 迴圈語法:
loop_name:loop
set num = num + i;
set sum = sum + num;
if num >= 10 THEN -- 滿足條件時離開迴圈
leave loop_name; -- 和 break 差不多都是結束迴圈
end if;
end loop;
select sum;
end;
-- 呼叫過程
call pro_demoLoop(1);
執行結果:55
3)REPEAT 迴圈語句
REPEAT 迴圈與 LOOP 迴圈類似,不需要初始條件就可以直接進入迴圈體。
但是LOOP 迴圈不同的是,它有退出條件。因此,REPEAT 是執行一次操作後檢查條件是否成立。若成立,則結束迴圈;若不成立,則繼續執行下一次迴圈操作。
這種先執行迴圈操作再判斷迴圈條件的迴圈與 Java 中的 do-while 迴圈類似。語法格式如下:
repeat
迴圈體
until 條件 end repeat;
例項:
delimiter //
-- 建立過程 使用 while 迴圈輸出 1 到 10 的累加和
create procedure pro_demoRepeat(i int)
begin
declare num int default 0;
declare sum int default 0;
# repeat 迴圈語法
repeat
set num = num + i;
set sum = sum + num;
until num >= 10 end repeat;
select sum;
end;
-- 呼叫過程
call pro_demoRepeat(1);
執行結果:55
3. 總結
- 儲存過程是一組為了完成特定功能的 SQL 語句集合,MySQL 從5.0版本之後開始支援儲存過程。
- 儲存過程具有安全性高、減少網路流量等優勢,在實際專案開發過程中具有廣泛的應用。
- 建立儲存過程使用 CREATE PROCEDURE 結構,呼叫儲存過程使用 CALL 關鍵字。
- MySQL 儲存過程支援多種控制語句,包括條件語句( IF和 CASE )、迴圈語句(WHILE、LOOP、REPEAT)。