說道儲存過程,很多人都知道,但是真正用的人其實很少,但是在某些必要的場景,是必須使用的,雖然可以使用java程式碼解決,但是效率效能遠不及儲存過程
曾經在sqlserver 以及pgadmin上用過,mysql還真沒使用過,今天遇到這樣的場景那就使用一次吧
場景:訂單自動失效,定時任務跑批的時候會查詢出失效的訂單,根據失效的訂單中的相關item的id,再做相應的處理
begin declare cargoSourceId varchar(20); declare done int; declare cur_test CURSOR for select cargo_source_id from orders where order_status = '10' and datediff(NOW(),update_time)>=3; declare continue handler FOR SQLSTATE '02000' SET done = 1; open cur_test; repeat fetch cur_test into cargoSourceId; # 將要取消的失效對於的貨源全部更新為“未下單”狀態 update cargo_source set is_ordered=0,update_time=now() where id=cargoSourceId; until done end repeat; close cur_test; # 失效訂單 update orders set order_status='50', update_time=now() where order_status = '10' and datediff(NOW(),update_time)>=3; end
mybatis呼叫:
<!-- 呼叫儲存過程 --> <update id="updateOrderInvalidAfter3Days" statementType="CALLABLE"> CALL updateOrderInvalidAfter3Days </update>
service呼叫:
@Autowired private OrdersMapper ordersMapper; @Override public void updateOrderInvalidAfter3Days() { int result = ordersMapper.updateOrderInvalidAfter3Days(); System.out.println(result); }
tips:同樣的結果不同的手段,使用更優的手段來解決問題,幾年前我會選擇方便自己的做法,而現在要更多的考慮專案。