一、定義與目的:
定義:存儲過程是數據庫 SQL 語言層面的代碼封裝與重用(是數據庫中存儲復雜程序,以便外部程序調用的一種數據庫對象);
目的:我們為了完成特定功能的SQL語句集,經編譯創建並保存在數據庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行;
二、存儲過程的特點:
- 存儲過程可封裝,並隱藏復雜的商業邏輯。
- 存儲過程可以回傳值,並可以接受參數。
- 存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數據表或用戶定義函數不同。
- 存儲過程可以用在數據檢驗,強制實行商業邏輯等。
三、創建存儲過程:
1 DELIMITER $$ -- 修改 分隔符為 && 2 3 CREATE 4 /*[DEFINER = { user | CURRENT_USER }]*/ -- 定義誰有權限來執行、 DEFINER 表示按定義者擁有的權限來執行 、INVOKER 表示用調用者的權限來執行 5 PROCEDURE `xx_database`.`p_test`() -- 過程名([[IN|OUT|INOUT] 參數名 數據類型[,[IN|OUT|INOUT] 參數名 數據類型…]]) [特性 ...] 過程體 6 /*LANGUAGE SQL 7 | [NOT] DETERMINISTIC 8 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 9 | SQL SECURITY { DEFINER | INVOKER } 10 | COMMENT 'string'*/ 11 BEGIN 12 13 END$$ 14 15 DELIMITER ;
四、參數:
存儲過程中存在三種參數:輸入、輸出、輸入輸出:
IN:參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為默認值
OUT:該值可在存儲過程內部被改變,並可返回
INOUT:調用時指定,並且可被改變和返回
示例:
1 -- IN 型參數: 2 DELIMITER && 3 create procedure p_test(IN p_id int) 4 begin 5 select p_id; 6 set p_id = 22; -- 將 p_id 賦值為 22 7 select p_id; 8 end&& 9 DELIMITER ; 10 11 -- OUT 型參數: 12 DELIMITER && 13 create procedure p_test(OUT p_id int) 14 begin 15 select p_id; 16 set p_id = 22; -- 將 p_id 賦值為 22 17 select p_id; 18 end&& 19 DELIMITER ; 20 21 -- INOUT 型參數: 22 DELIMITER && 23 create procedure p_test(INTOUT p_id int) 24 begin 25 select p_id; 26 set p_id = 22; -- 將 p_id 賦值為 22 27 select p_id; 28 end&& 29 DELIMITER ; 30 31 -- 調用 p_test() 32 set @P_id = 100; -- @p_id 為用戶變量,用戶可以在后面的代碼里引用它 33 call p_test(@p_id); -- 存儲過程的調用 34 select @p_id; -- IN型不會影響@p_id 的值,而OUT、INOUT會將@p_id的值改變,具體數值有過程體來定
五、變量的定義:
1 DECLARE 變量名1[,變量名2...] 數據類型 [默認值];
數值型:
日期、時間類型:
字符串類型:
六、存儲過程的修改:
1 ALTER PROCEDURE sp_name 2 [{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } 3 | SQL SECURITY { DEFINER | INVOKER } 4 | COMMENT 'string']
名詞解釋:
sp_name:參數表示存儲過程或函數的名稱;
characteristic:參數指定存儲函數的特性。
CONTAINS SQL:表示子程序包含SQL語句,但不包含讀或寫數據的語句;
NO SQL:表示子程序中不包含SQL語句;
READS SQL DATA:表示子程序中包含讀數據的語句;
MODIFIES SQL DATA:表示子程序中包含寫數據的語句。
SQL SECURITY { DEFINER | INVOKER }:指明誰有權限來執行,DEFINER:表示只有定義者自己才能夠執行;INVOKER:表示調用者可以執行。
COMMENT 'string':是注釋信息。
示例:
ALTER PROCEDURE CountProc MODIFIES SQL DATA SQL SECURITY INVOKER ;