MySQL學習-存儲過程(二)-創建存儲過程
theme: healer-readable
攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第12天,點擊查看活動詳情
前言
上篇我們學習了一部分MySQL中的存儲過程。有興趣的小夥伴可以閲讀(# MySQL學習-存儲過程(一))。
下面繼續學習MySQL中的存儲過程。
上節,只學習到了存儲過程的語法,下面對語法進行以下説明:
存儲過程語法
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...)
[characteristics ...]
BEGIN
存儲過程體
END
- 參數名前面IN|OUT|INOUT的含義:
- IN:當前參數為輸入參數,也就是表示入參。存儲過程只是讀取這個參數的值。如果沒有定義參數種類,默認就是IN,表示輸入參數。
- OUT:當前參數為輸出參數,也就是表示出參。執行完成之後,調用這個存儲過程的程序可以讀取這個參數返回的值。
- INOUT:當前參數既可以為輸入參數,也可以為輸出參數。
- 形參類型可以是MySQL數據庫中的任意類型。
- characteristics表示創建存儲過程時指定的對存儲過程的約束條件,其取值信息如下:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
- LANGUAGE SQL:説明存儲過程執行體是由SQL語句組成的,當前系統支持的語言為SQL。
- [NOT] DETERMINISTIC:指明存儲過程執行的結果是否確定。DETERMINISTIC表示結果是確定的。每次執行存儲過程時,相同的輸入會得到相同的輸出。[NOT] DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸出。如果沒有指定任意一個值,默認為[NOT] DETERMINISTIC。
- { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL語句的限制。
- CONTAINS 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':註釋信息,可以用來描述存儲過程。
-
存儲過程中可以有多條SQL語句,如果僅僅有一條SQL語句,則可以省略BEGIN和END。編寫過程中可能需要複雜的SQL語句。
- BEGIN...END:BEGIN...END中間包含了多個語句,每個語句都以(;)號為結束符。
- DECLARE:DECLARE用來聲明變量,使用的位置在於BEGIN...END語句中間,而且需要在其他語句使用之前進行變量的聲明。
- SET:賦值語句,用於對變量進行賦值。
- SELECT...INTO:把從數據表中查詢的結果存放到變量中,也就是為變量賦值。
- 需要設置新的結束標記。
DELIMITER 新的結束標記
- MySQL的默認語句結束符是分號(;)。為了避免與存儲過程中SQL語句結束符相沖突,需要使用DELIMITER改變存儲過程的結束符。比如:“DELIMITER //”語句的作用是將MySQL的結束符設置為//,並以“END //”結束存儲過程。存儲過程定義完畢之後在使用“DELIMITER ;”恢復默認結束符。
- 當使用DELIMITER命令時,避免使用“\”字符,因為反斜線是MySQL的轉義字符。
DELIMITER //
CREATE PROCEDURE 存儲過程名(IN|OUT|INOUT 參數名 參數類型,...)
[characteristics ...]
BEGIN
存儲過程體
END //
今天先學習到這裏,明天繼續。