一、異同點
觸發器和存儲過程都是一組mysql語句集,都可以實現一些比較複雜的業務邏輯,可以直接在數據庫中,編寫業務邏輯,對不同的表進行操作,執行效率較高,不同的是存儲過程需要主動調用,如下:
#給參數賦值
set @b=5;
#調用存儲過程,並傳入參數
call proc_adder(2,@b,@s);
#獲取結果
select @s as sum;
而觸發器,的執行是在,我們對數據庫進行操作時主動調用的,對b表執行插入操作之前,調用觸發器如下:create trigger a after insert on b
二、缺點
雖然觸發器和存儲過程可以加強代碼的執行效率,但是把過多的業務邏輯存儲於數據庫中,不利於系統的運維管理,容易造成業務混亂,不利於系統的分成管理。
不同的數據庫下,語法差異較大,不利於數據庫移植,移植工作量大。
三、存儲過程
1、簡單創建存儲過程
2、創建代碼如下
use cpyx; #判斷如果存在刪除該觸發器 DROP PROCEDURE IF EXISTS `proc_while`; #觸發器開始 DELIMITER ;; #創建觸發器,定義輸入 輸出,IN n int、OUT m int CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_while`(IN n int) #開始邏輯編碼 BEGIN #定義變量 i s爲int型 declare i int; declare s int; #初始化賦值 set i=1; set s=0; #while循環,判斷臨界條件 while i<=n do #求和 set s=s+i; set i=i+1; #結束循環 end while; #查詢返回最終結果 select s; #結束觸發器 END;; DELIMITER ;
3、查詢與執行
use cpyx;
Show procedure status;
use cpyx;CALL proc_while(5)
三、觸發器
1、觸發器的創建
2、詳細代碼如下
#價格追蹤存儲過程(某件商品對於某個客戶的價格改變後,自動更新新的價格到追蹤表,供下次下單使用)
use tlb_trade;
#如果已經存在該觸發器則刪除
DROP trigger IF EXISTS price_track_insert;
#創建開始
DELIMITER $
#更新訂單清單表之後,創建價格追蹤的觸發器
create trigger price_track_insert after update on order_goods
#每條記錄都執行該操作
for each row
#開始業務
begin
#定義四個變量
declare a int;
declare b int;
declare c int;
declare d int;
#獲取訂單狀態
set b = (select AUDITSTATUS from place_order where ID=new.ORDERID);
#判斷清單狀態
if new.SALEFUNCTION=1 then
#獲取訂單的業務員和客戶id
set a = (select PERSONID from order_ref_person where ID=new.ORDERID);
set c = (select CUSTOMERID from order_ref_customer where ID=new.ORDERID);
set d=(select count(*) from price_track where CUSTOMERID=c and GOODSID=new.GOODSID);
#判斷價格追蹤是否存在,不存在新增記錄,存在則更新記錄
if d=0 then
insert into price_track(PERSONID,CUSTOMERID,GOODSID,CREATETIME,PRICE) values(a,c,new.GOODSID,now(),new.price);
else
update price_track set price_track.PRICE=new.price where CUSTOMERID=c and GOODSID=new.GOODSID;
#結束觸發器
end if;
end if;
end$
DELIMITER ;
1、詳細觸發器說明
https://www.cnblogs.com/wangprince2017/p/7827091.html
2、詳細存儲過程說明