mysql儲存過程示例

2021-09-02 20:30:12 字數 3391 閱讀 1502

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...