數據庫之存儲過程和存儲函數(六)
什么是存儲過程
存儲過程是一組為了完成某項特定功能的SQL語句集,其實質就是一段存儲在數據庫中的代碼。它可以由聲明式的sql語句和過程式sql語句組成。
優點
1. 可以增強sql語言的功能和靈活性
2. 良好的封裝性
3. 高性能
4. 減少網絡流量
5. 可作為一種安全機制來確保數據庫的安全性和數據的完整性
創建存儲過程
-- 自定義結束符$$
DELIMITER $$
-- 創建存儲過程
CREATE PROCEDURE sp_name([proc_parameter[,…]]) -- sp_name存儲過程的名稱
routine_body -- 存儲過程的主體部分,也稱為存儲過程體
-- 例:
CREATE PROCEDURE sp_update_sex(IN cid INT,IN csex CHAR(1))
BEGIN
UPDATE customers SET cust_sex=csex WHERE cust_id=cid;
END $$
-- 使用DECLARE語句聲明局部變量
DECLARE var_name[,…] type [DEFAULT value]
例:DECLARE var_name[,…] type [DEFAULT value]
-- 使用DECLARE語句聲明局部變量
1)只能在存儲過程體的BEGIN…END語句塊中聲明;
2)必須在存儲過程的開頭處聲明;
3)作用范圍僅限於聲明它的BEGIN…END語句塊;
4)不同於用戶變量
局部變量與用戶變量的區別:
1)局部變量聲明時,在其前面沒有@符號,並且它只能
被聲明它的BEGIN…END語句塊中的語句所使用;
2)用戶變量在聲明時,會在其名稱前面使用@符號,同
時已聲明的用戶變量存在於整個會話之中。
-- 使用SET語句為局部變量賦值
SET var_name=expr[,var_name=expr]…
例:SET cid=910;
-- 使用SELECT…INTO語句把選定列的值直接存儲到局部變量中
SELECT col_name[,…] INTO var_name[,…] table_expr
流程控制語句
1、條件判斷語句
IF 條件 THEN 表達式1 ELSE 表達式2 end if
CASE語句
2、循環語句
WHILE語句
例: WHILE 條件 表達式 END WHILE
REPEAT語句
例:repeat 表達式 END repeat
LOOP語句
例:loop 表達式 END loop
3、結束語句
ITERATE語句 -- 用於表示退出當前循環
4、使用DECLARE CURSOR語句創建游標
DECLARE cursor_name CURSOR FOR select_statement
5、使用OPEN語句打開游標
OPEN cursor_name
6、使用FETCH…INTO語句讀取數據
FETCH cursor_name INTO var_name[,var_name] …
7、使用CLOSE語句關閉游標
CLOSE cursor_name
8、使用CALL語句調用存儲過程
CALL sp_name([parameter[,…]])
CALL sp_name[()]
例:> CALL sp_update_sex(909,’M’);
9、使用DROP PROCEDURE語句刪除存儲過程
DROP PROCEDURE[IF EXISTS] sp_name
什么是存儲函數
存儲函數與存儲過程一樣,是由SQL語句和過程式語句組成的代碼片段。
使用CREATE FUNCTION語句創建存儲函數
CREATE FUNCTION sp_name([func_parameter[,…]])
RETURNS type -- 聲明存儲函數返回值的數據類型; type指定返回值的數據類型
routine_body -- 指定存儲函數的主體部分,也稱為存儲函數體
例:
Use mysql_test;
DELIMITER $$
CREATE FUNCTION fn_search(cid INT) RETURNS CHAR(20)
DETERMINISTIC
BEGIN
DECLARE SEX CHAR(20);
SELECT cust_sex INTO SEX FROM customers WHERE cust_id=cid;
IF SEX IS NULL THEN RETURN(SELECT’沒有該客戶’);
ELSE IF SEX=‘F’ THEN RETURN(SELECT’女’);
ELSE RETURN(SELECT ‘男’);
END IF;
END IF; END $$
使用關鍵字SELECT調用存儲函數
SELECT sp_name([func_parameter[,…]])
使用DROP FUNCTION語句刪除存儲函數
DROP FUNCTION [IF EXISTS] sp_name
存儲過程和存儲函數的區別
存儲函數 | 存儲過程 |
---|---|
不能擁有輸出參數 | 可以擁有輸出參數 |
必須包含一條RETURN語句 | 不允許包含RETURN語句 |
可以直接調用存儲函數,不需要CALL語句 | 需要CALL語句調用存儲過程 |