存儲例程:mysql
存儲例程是存儲在數據庫服務器中的一組sql語句,經過在查詢中調用一個指定的名稱來執行這些sql語句命令。web
使用場景:sql
咱們的應用程序分爲兩種:一種基於web,一種是基於桌面,他們都和數據庫進行交互來完成數據的存取工做。假設有一種應用程序包含了這兩種,如今要修改其中的一個查詢sql語句,那麼咱們可能要同時修改他們中對應的sql語句,當咱們的應用程序很龐大很負載的時候問題就出現了,不易維護!另外sql查詢放到咱們的web程序或桌面中易於遭到sql注入的破壞。而存儲過程正好能夠幫咱們解決這個問題。數據庫
mysql中的存儲例程包含了存儲過程和存儲函數,他們統稱爲存儲例程
express
存儲過程主要完成在獲取記錄或插入記錄或更新記錄或刪除記錄,即完成select,insert,delete,update等服務器
存儲函數只完成查詢的工做,可接受輸入參數並返回一個結果
ide
查詢數據庫的全部存儲過程:SHOWPROCEDURE STATUS函數
存儲過程語法:性能
DEMILITER $$ --重定義分割符spa
CREATE PROCEDURE sp_name()
begin --區塊定義開始
......
end --區域定義結束
$$ --定義的分割符
刪除存儲過程:DROP PROCEDURE procedure_name
變量定義:局部變量聲明必定放在存儲過程體的開始
DECLARE variable_name [,variable_name...] DATATYPE [default value]
datatype 爲MySQL的數據類型,如int,float,date,varchar(length)
例子:DECLARE l_int int unsighed default 40000;
變量賦值:
SET 變量名 = 表達式 [,variable_name = expression ...]
觸發器:
不用想存儲過程須要再程序中進行調用,是在INSERT/PUDATE/DELETE等DML語句修改數據表時觸發。
應用場景:重要的業務邏輯、提升性能、監控表的修改等
語法:
DELIMITER $$
CREATE TRIGGER tri_stuname --觸發器名稱
trigger_time --觸發時機 取值爲before/after
trigger_event -- 觸發時間,取值爲INSERT/UPDATE/DELETE; ON tbl_name --創建觸發器的表名
FOR EACH ROW
trigger_stmt --觸發器程序體, begin ....end
實例:
DELIMITER $ create trigger tri_stuInsert after insert on student for each row begin declare c int; set c = (select stuCount from class where classID=new.classID); update class set stuCount = c + 1 where classID = new.classID; end$ DELIMITER ;