MySQL自学笔记——存储过程
含義
存儲過程的英文是Stored Procedure。它的思想很簡單,就是一組經過預先編譯的SQL語句的封裝。存儲過程預先存儲在MySQl服務器上,需要執行的時候,客戶端只需要向服務器端發出調用存儲過程的命令,服務器端就可以把預先存儲好的這一系列SQL語句全部執行。
好處
1、簡化操作,提高了sql語句的重用性,減少了開發程序員的壓力
2、減少操作過程中的失誤,提高效率
3、減少網絡傳輸量(客戶端不需要把所有的SQL語句通過網絡發給服務器)
4、減少了SQL語句暴露在網上的風險,也提高了數據查詢的安全性
分類
存儲過程的參數類型可以是IN、OUT和INOUT。根據這點分類如下:
1、沒有參數(無參數無返回)
2、僅僅帶IN類型(有參數無返回)
3、僅僅帶OUT類型(無參數有返回)
4、既帶IN又帶OUT (有參數有返回)
5、帶INOUT?(有參數有返回)
注意:?IN、OUT、INOUT都可以在一個存儲過程中帶多個。
語法
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名,參數類型,...)
[characteritics...] #表示創建存儲過程時指定的對存儲過程的約束條件
BEGIN
? ? ?存儲過程體
END
?characteristics 取值信息如下:
LANGUAGE?SQL
|?[NOT]?DETERMINISTIC
|?{?CONTAINS?SQL? ?|? ?NO?SQL? ?I? ?READS?SQL?DATA? ?I? ?MODIFIES?SQL?DATA}
|?SQL?SECURITY?{?DEFINER? ?|? ?INVOKER?}
|?COMMENT?‘string'
?LANGUAGE?SQL?:說明存儲過程執行體是由SQL語句組成的,當前系統支持的語言為SQL
[NOT]?DETERMINISTIC:?指明存儲過程執行的結果是否確定。
DETERMINISTIC表示結果是確定的。?每次執行存儲過程時,相同的輸入會得到相同的輸出。NOT?DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸出。
如果沒有指定任意一個值,?默認為NOT?DETERMINISTIC
{?CONTAINS?SQLI?NO?SQL?|?READS?SQL?DATA?|?MODIFIES?SQL?DATA?} :指明子程序使用SQL語句的限制。
ONTAINS?SQL表示當前存儲過程的子程序包含SQL語句,但是并不包含讀寫數據的SQL語句;
NO?SQL表示當前存儲過程的子程序中不包含任何SQL語句;
READS?SQL?DATA表示當前存儲過程的子程序中包含讀數據的SQL語句;
MODIFIES?SQL?DATA表示當前存儲過程的子程序中包含寫數據的SQL語句。
默認情況下,系統會指定為CONTAINS?SQL.
SQL?SECURITY?{DEFINER? |??INVOKER}:執行當前存儲過程的權限,即指明哪些用戶能夠執行當前存儲過程
DEFINER?表示只有當前存儲過程的創建者或者定義者才能執行當前存儲過程
INVOKER表示擁有當前存儲過程的訪問權限的用戶能夠執行當前存儲過程
如果沒有設置相關的值,則MySQL默認指定值為DEFINER。
COMMENT?‘string'
注釋信息,可以用來描述存儲過程。
知識點補充:DELIMITER(新的結束標記)
因為MySQL默認的語句結束符號為分號。為了避免與存儲過程中SQL語句結束符相沖突,需要使用DELIMITER改變存儲過程的結束符。
比如:“DELIMITER?//語句的作用是將MySQL的結束符設置為//,并以“END?//"結束存儲過程。存儲過程定義完畢之后再使用"DELIMITER?;”恢復默認結束符。DELIMITER也可以指定其他符號作為結束符。
當使用DELIMITER命令時,應該避免使用反斜杠('\')?字符,因為反斜線是MySQL的轉義字符。
?使用存儲過程:
CALL select_all_data();帶OUT參數
DELIMITER $CREATE PROCEDURE show_min_salary(OUT ms DECIMAL(10,2)) BEGINSELECT min(salary) INTO msfrom demo; END $DELIMITER ;使用存儲過程:?
CALL show_min_salary(@ms);SELECT @ms?帶IN參數
DELIMITER $CREATE PROCEDURE show_someone_salary(IN empid int) BEGINSELECT salary from demoWHERE id=empid; END $DELIMITER ;使用存儲過程:
CALL show_someone_salary(2)?帶IN和OUT參數
DELIMITER //create procedure show_someone_salary2(IN empid int , OUT empsalary DECIMAL(10,2)) beginselect salary into empsalaryfrom demowhere id=empid; end //DELIMITER ;使用存儲過程:
set @empid=1; call show_someone_salary2(@empid,@empsalary);select @empsalary帶INOUT參數
DELIMITER //create procedure show_salary(INOUT empid int) BEGINSELECT salary into empidfrom demowhere id=empid; END //DELIMITER ;?使用存儲過程:
set @empid=2;CALL show_salary(@empid);SELECT @empid;存儲函數
語法
CREATE FUNCTION 函數名(參數名 參數類型)
RETURNS 返回值類型
[characteristics ...]??#表示創建存儲過程時指定的對存儲過程的約束條件
BEGIN
? ? ? ? ? ? 函數體? #函數體中肯定有 RETURN 語句
END
?characteristics詳情見存儲過程
?例子:
CREATE FUNCTION email_by_id() RETURNS VARCHAR(20)DETERMINISTICCONTAINS SQLREADS SQL DATA BEGINRETURN(SELECT email FROM demo WHERE manager_id=1); END CREATE FUNCTION email_by_id(emp_id INT) RETURNS varchar(20)DETERMINISTICCONTAINS SQLREADS SQL DATA BEGINRETURN(SELECT email FROM demo WHERE manager_id=emp_id); END調用
SELECT 函數名(實參列表)?
SELECT email_by_id(); OR SELECT email_by_id(1);對比存儲函數和存儲過程
| 關鍵字 | 調用語法 | 返回值 | 應用場景 | |
| 存儲過程 | PORCEDURE | CALL? 存儲過程() | 有0個或者多個 | 一般用于更新 |
| 存儲函數 | FUNCTION | SELECT 函數() | 只能是一個 | 一般用于查詢結果為一個值并返回時 |
此外,存儲函數可以放在查詢語句中使用,存儲過程不行。但存儲過程的功能更加強大,包括能過執行對表的操作,這些是存儲函數不具備的?
存儲過程和函數的查看、修改、刪除
查看
SHOW? ?CREATE? ?PROCEDURE? /? FUNCTION? 存儲過程名或函數名
SHOW? ?PROCEDURE? /? ?FUNCTION? STATUS??
SHOW? ?PROCEDURE? /? ?FUNCTION? STATUS? LIKE? 模糊查詢
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME=' 函數名 / 存儲過程名?'
AND ROUTINE_TYPE='FUNCTION / PROCEDRE'(這里必須為大寫)
?修改
修改存儲過程或函數,不影響存儲函數或函數的功能,只是修改相關特性
ALTER? PROCEDURE /? FUNCTION? 存儲過程或函數名??[characteristics ...]
? 此處characteristics 取值信息如下:
{?CONTAINS?SQL? ?|? ?NO?SQL? ?I? ?READS?SQL?DATA? ?I? ?MODIFIES?SQL?DATA}
|?SQL?SECURITY?{?DEFINER? ?|? ?INVOKER?}
|?COMMENT?‘string'
例子:?
ALTER FUNCTION email_by_id SQL SECURITY INVOKER COMMENT 'abababa'刪除?
DROP? PROCEDURE /? FUNCTION? 存儲過程或函數名
總結
以上是生活随笔為你收集整理的MySQL自学笔记——存储过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基层员工和领导者的区别,悟到这一层,你也
- 下一篇: NAR | IMG/VR v4:在广泛的