標籤:應用程式 伺服器 sql語句 update insert
儲存常式:
儲存常式是儲存在資料庫伺服器中的一組sql語句,通過在查詢中調用一個指定的名稱來執行這些sql語句命令。
使用情境:
我們的應用程式分為兩種:一種基於web,一種是基於案頭,他們都和資料庫進行互動來完成資料的存取工作。假設有一種應用程式套件組合含了這兩種,現在要修改其中的一個查詢sql語句,那麼我們可能要同時修改他們中對應的sql語句,當我們的應用程式很龐大很負載的時候問題就出現了,不易維護!另外sql查詢放到我們的web程式或案頭中易於遭到sql注入的破壞。而預存程序正好可以幫我們解決這個問題。
mysql中的儲存常式包含了預存程序和儲存函數,他們統稱為儲存常式
預存程序主要完成在擷取記錄或插入記錄或更新記錄或刪除記錄,即完成select,insert,delete,update等
儲存函數只完成查詢的工作,可接受輸入參數並返回一個結果
查詢資料庫的所有預存程序:SHOWPROCEDURE STATUS
預存程序文法:
DEMILITER $$ --重定義分割符
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 ;
mysql之預存程序和觸發器的應用