mysql存儲過程和函數(一)
存儲過程和函數是事先經過編譯並存儲在數據庫的一段sql語句集合,調用存儲過程和函數可以簡化應用程序開發人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,對提高數據運行效率是有好處的。
存儲過程和函數的區別在於函數必須有返回值,而存儲過程卻沒有,存儲過程的參數可以使用IN,OUT,INOUT類型,而函數的參數只能使用IN類型,
在對存儲過程或者函數進行操作時,需要先判斷用戶是否有相應的權限,例如,創建存儲過程或者函數需要 CREATE ROUTINE 權限,修改或者刪除存儲過程或者函數需要 ALTER ROUTINE 權限,執行存儲過程或者函數則需要EXECUTE權限。
創建 存儲過程語法:
CREATE PROCEDURE findUser (IN p_u_id INT) BEGIN SELECT id,username,phone FROM mmall_user WHERE id = p_u_id; END;
調用存儲過程的語法:
CALL findUser (23) ;
在執行存儲存儲過程或者函數之前,可以通過“DELIMITER $$” 命令將語句的結束符從“;”修改成其他符號 , 這裏是用的是$$ ,這樣在過程或者函數中的;就不會被mysql解釋成語句的結束而提示錯誤,在存儲過程或者函數結束後,要通過“DELIMITER ;” 命令再將結束符該回成“;”
在數據庫調用存儲過程和直接執行sql的結果是相同的,但是存儲過程的好處在於處理邏輯都封裝在數據庫端,調用者不需要了解中間的處理邏輯,一旦處理邏輯發生變化,只需要修改存儲過程就可以。而對調用者的程序完全沒有影響。
刪除存儲過程或者函數:
一次只可以刪除一個存儲過程或者函數,刪除存儲過程或者函數需要有該過程或者函數的“ALTER ROUTINE”權限。
DROP {PROCEDURE/FUNCTION} IF EXISTS findUser; #判斷是否存在同名的存儲過程,刪除
查看存儲過程或者權限:
1.查看存儲過程或者函數的狀態
SHOW {PROCEDURE/FUNCTION} STATUS [LIKE ‘pattern‘]
2.查看存儲過程或者函數的定義
SHOW CREATE {PROCEDURE/FUNCTION} sp_name
3.通過查看 information_schema.Routines 了解存儲過程和函數的信息
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME = sp_name;
變量的使用:
1.變量的定義:通過DECLARE可以定義一個局部變量,該變量的作用範圍只能在BEGIN...END塊中,可以用在嵌套的塊中。變量的定義必須寫在復合語句定義的開頭,並且在任何其他語句的前面,可以一次聲明多個同類型的變量。如果需要,可以使用DEFAULT賦默認值。
定義變量的語法:
DECLARE var_name [...] type [DEFAULT value]
例:
CREATE FUNCTION get_username(productId int ,p_create_time DATETIME) RETURNS DECIMAL(10,2) DETERMINISTIC READS SQL DATA BEGIN DECLARE varPay DECIMAL(10,2) ; select IFNULL(sum(price),0) INTO varPay from mmall_product where create_time<=p_create_time and id = productId; RETURN varPay; END;
查看所有變量:
show session variables;
mysql存儲過程和函數(一)