create procedure `pro_cancel_order`(
in orderid int ,
in userid int ,
out resultstatus int
) comment '取消商品訂單'
begin
######引數說明#######
#orderid 訂單id
#extras 擴充套件記錄
-- 異常處理
declare continue handler
for 1062
set resultstatus=500;-- 異常
set resultstatus=0;
start transaction; #宣告事務開始
#修改商品訂單表
#update `tos_goods_order` set `order_status` =-1,`cancel_status` =2,`deleted` =1,`update_time` =now()
update `tos_goods_order` set `order_status` =-1,`cancel_status` =2,`update_time` =now()
where `id` = orderid;
#修改訂單商品表
update `tos_goods_order_goods` set `deleted` =1,`update_time` =now()
where `order_id` = orderid;
#訂單日誌表插入記錄
insert into `tos_goods_order_log`(`order_id` ,`user_id` ,`old_status` ,`new_status` , `remark`,`create_time` )
values(orderid,userid,1,-1,'取消訂單',now());
set resultstatus=200;-- 訂單取消成功
commit;
# 回滾
if resultstatus=500 then
rollback;
else
commit;
end if;
select resultstatus;#輸出引數
end
儲存過程遍歷:
create procedure `pro_time_cancel_order`()
comment '定時取消商品訂單'
begin
########todo 需要查詢所有超15分鐘的末支付訂單,並進行取消操作############
declare orderid int;# 訂單id
declare userid int;# 使用者id
declare goodsid int;# 商品id
declare goodsnum int;# 商品數量
##遍歷資料結束標誌
declare done int default false;
##宣告游標##
declare cur_order cursor for select g.`id`,g.`user_id`,g1.`goods_id`,g1.`num` from `tos_goods_order` g join `tos_goods_order_goods` g1 on(g.`id`=g1.`order_id`) where g.`order_status`=1 and g.`deleted`=0 and now()>date_add(g.`create_time`,interval 15 minute);
##異常處理
declare continue handler for not found set done = true;
##開啟游標
open cur_order;
##賦值
fetch next from cur_order into orderid,userid,goodsid,goodsnum;
#遍歷repeat
if not done then
##釋放商品庫存
update `tos_goods` set `store_count` = `store_count` +goodsnum where `id`=goodsid;
#修改商品訂單表
update `tos_goods_order` set `order_status` =-1,`cancel_status` =2,`update_time` =now() where `id` = orderid;
#訂單日誌表插入記錄
insert into `tos_goods_order_log`(`order_id` ,`user_id` ,`old_status` ,`new_status` , `remark`,`create_time` )
values(orderid,userid,1,-1,'取消訂單',now());
#記錄取消訂單更新時間
update `tos_sys_time_task` set `update_time`=now() where `id`=1;
commit;
end if;
fetch next from cur_order into orderid,userid,goodsid,goodsnum;
until done end repeat;
##關閉游標
close cur_order;
end
事件來定時執行儲存過程:
檢視event是否開啟: show variables like '%sche%';
將事件計畫開啟: set global event_scheduler=1;
關閉事件任務: alter event e_test on completion preserve disable;
開戶事件任務: alter event e_test on completion preserve enable;
drop event `tosuser`.`e_time_cancel_order`;
create event `tosuser`.`e_time_cancel_order`
on schedule every 60 second
starts '2017-06-02 15:00:53' on completion preserve
enable
comment '定時取消訂單事件'
do begin
/**定時取消商品訂單**/
call pro_time_cancel_order();
end
MySQL儲存過程示例
mysql儲存過程 自定義結束符 delimiter 如果存在同名的儲存過程就刪除 drop procedure if exists praddblack 建立儲存過程 create procedure praddblack in n int begin while n 999 do insert ...
mysql 儲存過程示例
在mysql的test庫中執行如下sql table structure for user drop table if exists user create table user id int 11 unsigned not null auto increment,tinyint 1 not nul...
mysql儲存過程示例
mysql儲存過程示例delimiter use mall system 刪除儲存過程 drop procedure ifexists get statistics 建立儲存過程 create definer root localhost procedure get statistics in sh...