本文參考:https://blog.csdn.net/a__yes/article/details/52795793
https://blog.csdn.net/tojohnonly/article/details/70738629
1. 存儲過程的概念
存儲過程 (Stored Procedure) 是在大型數據庫系統中 , 一組爲了完成特定功能的 SQL 語句集 , 存儲在數據庫中 , 經過第一次編譯後再次調用不需要再次編譯 , 用戶通過指定存儲過程的名字並給出參數 (如果該存儲過程帶有參數) 來執行它 , 存儲過程是數據庫中的一個重要對象 ; 存儲過程中可以包含 邏輯控制語句
和 數據操縱語句
, 它可以接受參數 , 輸出參數 , 返回單個或多個結果集以及返回值 ;
2. 存儲過程的優缺點
優點 :
- 由於應用程序隨着時間推移會不斷更改 , 增刪功能 , SQL 語句會變得更復雜 , 存儲過程爲封裝此類代碼提供了一個替換位置 ;
- 由於存儲過程在創建時即在數據庫服務器上進行了編譯並存儲在數據庫中 , 所以存儲過程運行要比單個的 SQL 語句塊要快 ;
- 由於在調用時只需用提供存儲過程名和必要的參數信息 , 所以在一定程度上也可以減少網絡流量 , 簡單網絡負擔 ;
- 可維護性高 , 更新存儲過程通常比更改 , 測試以及重新部署程序集需要較少的時間和精力 ;
- 代碼精簡一致 , 一個存儲過程可以用於應用程序代碼的不同位置 ;
- 增強安全性 :
- 通過向用戶授予對存儲過程 (而不是基於表) 的訪問權限 , 它們可以提供對特定數據的訪問 ;
- 提高代碼安全 , 防止
SQL注入
(但未徹底解決 , 例如將數據操作語言DML
附加到輸入參數) ; - SQLParameter 類指定存儲過程參數的數據類型 , 作爲深層次防禦性策略的一部分 , 可以驗證用戶提供的值類型 (但也不是萬無一失 , 還是應該傳遞至數據庫前得到附加驗證) ;
缺點 :
- 如果更改範圍大到需要對輸入存儲過程的參數進行更改 , 或者要更改由其返回的數據 , 則仍需要更新程序集中的代碼以添加參數 , 等等 ;
- 可移植性差 , 由於存儲過程將應用程序綁定到 Server , 因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性 ; 如果應用程序的可移植性在您的環境中非常重要 , 則將業務邏輯封裝在不特定於 RDBMS 的中間層中可能是一個更佳的選擇 ;
3. 本次使用的工具是MySqlWorkbench
範例(1):DELIMITER // # DELIMITER // 聲明語句結束符,用於區分;
create procedure myTest(
out minScore int,
out avgScore decimal(8,2),
out maxScore int
)
begin
select avg(score) into avgScore from sc where sid=01;
select min(score) into minScore from sc where sid=01;
select max(score) into maxScore from sc where sid=01;
end;
//
DELIMITER ;
call myTest(@minScore, @avgScore, @maxScore); #調用存儲過程
select @minScore, @avgScore, @maxScore;
drop procedure if exists myTest; #刪除存儲過程
(數據來源sc表自己可以創建)
查詢結果如下:
範例(2):
USE `mytest`;
DROP procedure IF EXISTS `sumAB`;
DELIMITER $$
USE `mytest`$$
CREATE PROCEDURE `sumAB` (
in a int,
in b int,
out c int )
BEGIN
if a is null then set a=0;
end if ;
if b is null then set b=0;
end if;
set c=a*b;
END$$
DELIMITER ;
call sumAB(3,2,@c);
select @c;
查詢結果如下: